English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Este artículo abordará uno por uno los siguientes aspectos para resolver
1、Función principal del programa
2、Proceso de implementación
3、Definición de la clase
4、Utilice generadores generator para actualizar dinámicamente cada objeto y devolver el objeto
5、Utilice strip para eliminar caracteres innecesarios
6、Rematch para coincidir cadenas
7、Utilice timestrptime para convertir una cadena en un objeto de tiempo
8y código completo
función principal del programa
Ahora hay un documento similar a una tabla para almacenar información de usuarios: la primera línea son las propiedades, las propiedades se separan por comas (,), desde la segunda línea en adelante, cada línea es el valor correspondiente a cada propiedad, cada línea representa un usuario. ¿Cómo implementar la lectura de este documento, y emitir un objeto de usuario en cada línea?
Además, hay4pequeños requisitos:
Cada cadena separada por comas, las cadenas pueden estar entre comillas dobles (+000000001.24Para este formato, debe eliminar el número anterior+y 0 se eliminan, se extrae1.24
El documento tiene un tiempo, que puede ser2013-10-29también puede ser2013/10/29 2:23:56 Para este formato, debe convertir esta cadena a un tipo de tiempo
Este tipo de documento tiene muchos, cada uno con propiedades diferentes, por ejemplo, este es la información del usuario, y ese es el registro de llamadas. Por lo tanto, las propiedades específicas de la clase deben generarse dinámicamente en el primer párrafo del documento.
proceso de implementación
1.definición de la clase
Dado que las propiedades se agregan dinámicamente, la propiedad-Los valores también se agregan dinámicamente. El objeto debe contener los métodos miembros updateAttributes() y updatePairs(). Además, se almacenan las propiedades en la lista attributes y los mapeos en el diccionario attrilist. El función init() es el constructor. Los variables __attributes tienen subrayado al principio, lo que indica que son variables privadas y no se pueden llamar directamente desde afuera. Al instanciar, solo se necesita a = UserInfo() y no se requieren parámetros.
class UserInfo(object): 'Clase para restaurar la Información del Usuario' def __init__ (self): self.attrilist={} self.__attributes=[] def updateAttributes(self,attributes): self.__attributes=attributes def updatePairs(self,values): for i in range(len(values)): self.attrilist[self.__attributes[i]]=values[i]
2.Actualizar dinámicamente cada objeto y devolverlo con el generador (generator)
Un generador es una función que solo necesita inicializarse una vez y puede ejecutarse múltiples veces de manera automática, devolviendo un resultado en cada iteración. Sin embargo, mientras que la función devuelve resultados con return, el generador los devuelve con yield. Cada ejecución ocurre en el punto de yield, y la próxima comienza después de yield. Por ejemplo, para implementar la secuencia de Fibonacci, se puede usar una función y un generador:
def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return 'done'
Calculamos la secuencia de números hasta6Número:
>>> fib(6) 1 1 2 3 5 8 'done'
Si se usa un generador, simplemente cambie print por yield. Por ejemplo:
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1
Uso:
>>> f = fib(6) >>> f <generator object fib at 0x104feaaa0> >>> for i in f: ... print(i) ... 1 1 2 3 5 8 >>>
Se puede ver que el generador fib en sí es un objeto, cada vez que se ejecuta hasta yield se interrumpe y devuelve un resultado, luego vuelve a continuar desde la línea siguiente de yield. Los generadores también se pueden ejecutar con generator.next().
En mi programa, la parte del código del generador es como sigue:
def ObjectGenerator(maxlinenum): filename='/home/thinkit/Documents/usr_info/USER.csv' attributes=[] linenum=1 a=UserInfo() file=open(filename) while linenum < maxlinenum: values=[] line=str.decode(file.readline(),'gb2312)#linecache.getline(filename, linenum,'gb2312) if line=='': print'reading fail! Please check filename!' break str_list=line.split(',') for item in str_list: item=item.strip() item=item.strip('"') item=item.strip(''') item=item.strip('+0*) item=catchTime(item) if linenum==1: attributes.append(item) else: values.append(item) if linenum==1: a.updateAttributes(attributes) else: a.updatePairs(values) yield a.attrilist #Cambiar a 'a' para usar linenum = linenum +1
Dentro de esto, a=UserInfo() es una instancia de la clase UserInfo. Porque el documento es gb2312Codificados, se utilizó el método de decodificación correspondiente. Debido a que la primera línea es un atributo, hay una función que almacena la lista de atributos en UserInfo, es decir, updateAttributes(); Las líneas posteriores deben almacenar las propiedades-Los valores se leen en un diccionario y se almacenan. p.s. El diccionario en python es equivalente a un mapeo (map).
3.Usar strip para quitar caracteres innecesarios
Desde el código anterior, se puede ver que usar str.strip(somechar) se puede quitar los caracteres somechar al principio y al final de str. somechar puede ser un símbolo, también puede ser una expresión regular, como el ejemplo anterior:
item=item.strip()#Quitar todos los caracteres de escape al principio y al final de la cadena, como\t,\n, etc. item=item.strip('\"')#Quitar los caracteres antes y después" item=item.strip(''') item=item.strip('+0*')#Quitar los caracteres antes y después+00...00,*Representa la cantidad de ceros que puede ser arbitraria, también puede no haber
4.re.match coincide con la cadena
Sintaxis de la función:
re.match(pattern, string, flags=0)
Descripción de los parámetros de la función:
Parámetros Descripción
pattern Expresión regular que se debe coincidir
string La cadena que se debe coincidir.
flags Bandera, utilizada para controlar la forma de coincidencia del expresión regular, como: si distingue entre mayúsculas y minúsculas, coincidencia de múltiples líneas, etc.
Si la coincidencia es exitosa, el método re.match devuelve un objeto de coincidencia, de lo contrario devuelve None.
>>> s='2015-09-18'
>>> matchObj=re.match(r'\d{4}-\d{2}-\d{2}',s, flags= 0)
>>> print matchObj
<_sre.SRE_Match object at 0x7f3525480f38>
1
2
3
4
5
5Usar time.strptime para convertir una cadena en un objeto de tiempo
En el módulo time, time.strptime(str, format) puede convertir str según el formato format en un objeto de tiempo, los formatos comunes en format incluyen:
%y Año de dos dígitos (00-99)
%Y Año de cuatro dígitos (000-9999)
%m Mes (01-12)
%d Día del mes (0-31)
%H 24número de hora en formato de 12 horas (0-23)
%I 12número de hora en formato de 12 horas (01-12)
%M minutos (00=59)
%S segundos (00-59)
Además, es necesario utilizar el módulo re, con expresiones regulares, para coincidir con la cadena de caracteres y ver si es un formato de tiempo común, como Año/MM/DD H:M:S, Año-MM-DD et al
En el código anterior, la función catchTime es la que determina si item es un objeto de tiempo, y si lo es, lo convierte en un objeto de tiempo.
Código como se muestra a continuación:
import time import re def catchTime(item): # check if it's time matchObj=re.match(r'\d{4}-\d{2}-\d{2}',item, flags= 0) if matchObj!= None : item =time.strptime(item,'%Y-%m-%d) #print "returned time: %s " %item return item else: matchObj=re.match(r'\d{4}/\d{2}/\d{2\s\d+:\d+:\d+',item,flags=0 ) if matchObj!= None : item =time.strptime(item,'%Y/%m/%d %H:%M:%S') #print "returned time: %s " %item return item
Código completo:
import collections import time import re class UserInfo(object): 'Clase para restaurar la Información del Usuario' def __init__ (self): self.attrilist=collections.OrderedDict()# ordered self.__attributes=[] def updateAttributes(self,attributes): self.__attributes=attributes def updatePairs(self,values): for i in range(len(values)): self.attrilist[self.__attributes[i]]=values[i] def catchTime(item): # check if it's time matchObj=re.match(r'\d{4}-\d{2}-\d{2}',item, flags= 0) if matchObj!= None : item =time.strptime(item,'%Y-%m-%d) #print "returned time: %s " %item return item else: matchObj=re.match(r'\d{4}/\d{2}/\d{2\s\d+:\d+:\d+',item,flags=0 ) if matchObj!= None : item =time.strptime(item,'%Y/%m/%d %H:%M:%S') #print "returned time: %s " %item return item def ObjectGenerator(maxlinenum): filename='/home/thinkit/Documents/usr_info/USER.csv' attributes=[] linenum=1 a=UserInfo() file=open(filename) while linenum < maxlinenum: values=[] line=str.decode(file.readline(),'gb2312)#linecache.getline(filename, linenum,'gb2312) if line=='': print'reading fail! Please check filename!' break str_list=line.split(',') for item in str_list: item=item.strip() item=item.strip('"') item=item.strip(''') item=item.strip('+0*) item=catchTime(item) if linenum==1: attributes.append(item) else: values.append(item) if linenum==1: a.updateAttributes(attributes) else: a.updatePairs(values) yield a.attrilist #Cambiar a 'a' para usar linenum = linenum +1 if __name__ == '__main__': for n in ObjectGenerator(10) : print n #Verificar si el diccionario se muestra correctamente
Resumen
Esto es todo el contenido de este artículo, espero que pueda ayudar a su aprendizaje o trabajo. Si tienen alguna pregunta, pueden dejar un comentario para discutir, gracias por su apoyo a Tutorial de Gritar.