time.strptime (): el argumento 0 debe ser str, no bytes

Obviamente, ya sé que a strftime y strptime no les gustan las cadenas de bytes como parámetros, sin embargo, estoy en un aprieto porque necesito leer un contenido de archivo que tiene diferentes codificaciones de caracteres guardadas en él y necesito manejarlo a todos, y envíe la porción de tiempo de cada línea en este archivo de texto a strptime() .

Una solución rápida sería dividir la cadena, asegurándose de que la hora simplemente contenga números y guiones, pero ¿es posible pasar el objeto de byte sin tratar de averiguar la encoding de strptime() ?

 with open('file.txt', 'rb') as fh: for line in fh: time.strptime(line, '%Y-%m-%d ...') 

Esto obviamente fallaría. Pensé en hacer repr(line) pero eso hace que la cuerda se vea como b'2014-01-07 ...' , que podría quitar …

line es una combinación de valores, porque abrió el archivo en modo binario. Tendrás que decodificar la cadena; Si se trata de una cadena de fecha que coincide con el patrón, simplemente puede usar ASCII:

  time.strptime(line.decode('ascii'), '%Y-%m-%d ...') 

Puede agregar un argumento 'ignore' para ignorar cualquier cosa que no sea ASCII, pero es probable que la línea no se ajuste a su formato de fecha de todos modos.

Tenga en cuenta que no puede pasar un valor que contenga más que el formato analizado en él; una línea con otro texto que no esté cubierto explícitamente por el patrón strptime() no funcionará, independientemente del códec que haya utilizado.

Y si su entrada realmente varía mucho en los códecs, deberá detectar las excepciones de una forma u otra.

Aparte de UTF-16 o UTF-32, no esperaría que encontraras ningún códecs que use bytes diferentes para los números arábigos. Si su entrada realmente mezcla los códecs de múltiples bytes y de un solo byte en un archivo, tiene un problema mayor en su mano, no en lo más mínimo, ya que el manejo de la nueva línea estará muy desordenado.

Debes decodificar los datos cuando estés leyendo el archivo:

 import codecs with codecs.open('file.txt', encoding='utf8') as fh: for line in fh: time.strptime(line, '%Y-%m-%d ...') 

Siempre es mejor decodificar tu contenido lo antes posible.

También puedes ver http://docs.python.org/2/library/codecs.html#codecs.open