2009-03-02 10 views
12

Cada vez que intento abrir un archivo .csv con el comando python fread = open('input.csv', 'r') siempre abre el archivo con espacios entre cada carácter. Supongo que algo va mal con el archivo de texto porque puedo abrir otros archivos de texto con el mismo comando y se cargan correctamente. ¿Alguien sabe por qué un archivo de texto se cargaría así en Python?python abre el archivo de texto con un espacio entre cada carácter

Gracias.

actualización

Ok, lo tengo con la ayuda del puesto de Jarret Hardie

este es el código que he utilizado para convertir el archivo a ASCII

fread = open('input.csv', 'rb').read() 
mytext = fread.decode('utf-16') 
mytext = mytext.encode('ascii', 'ignore') 
fwrite = open('input-ascii.csv', 'wb') 
fwrite.write(mytext) 

Gracias!

Respuesta

14

La publicación por recursivo probablemente sea correcta ... el contenido del archivo probablemente esté codificado con un juego de caracteres de varios bytes. Si este es, de hecho, el caso, es probable que pueda leer el archivo en python sin tener que convertirlo primero fuera de Python.

Pruebe algo como:

fread = open('input.csv', 'rb').read() 
mytext = fread.decode('utf-16') 

La bandera 'b' asegura que el archivo se lee como datos binarios. Necesitarás saber (o adivinar) la codificación original ... en este ejemplo, he usado utf-16, pero YMMV. Esto convertirá el archivo a Unicode. Si realmente tiene un archivo con caracteres multi-byte, no recomiendo convertirlo a ASCII ya que puede terminar perdiendo muchos de los caracteres en el proceso.

EDITAR: Gracias por cargar el archivo. Hay dos bytes al frente del archivo que indican que, de hecho, usa un juego de caracteres ancho. Si tiene curiosidad, abra el archivo en un editor hexadecimal como algunos han sugerido ... verá algo en la versión de texto como 'I.D. |'. (etc.) El punto es el byte extra para cada char.

El fragmento de código anterior parece funcionar en mi máquina con ese archivo.

0

Nunca me ocurrió, pero como dijo truppo, debe haber algún problema con el archivo.

Intente abrir el archivo en Excel/BrOffice Calc y guardar como el archivo como Csv nuevamente.

Si el problema persiste, intente con un subconjunto de los datos: puño 10/últimos 10/intermedio 10 líneas del archivo.

1

No es csv un archivo txt simple con valores separados por comas. Intenta abrirlo con un editor de texto para ver si el archivo está formado correctamente.

+0

así, se trata de un archivo de texto y formateado correctamente con | caracteres en lugar de comas, pero el problema es en realidad antes de tratar de leerlo en el lector csv. – wlindner

0

También podría cargar el archivo en cuestión en un sitio como http://drop.io/ y darnos un enlace.

+0

http://drop.io/nbcacm5 – wlindner

7

El archivo está codificado en alguna codificación Unicode, pero lo está leyendo como ascii. Intenta convertir el archivo a ascii antes de usarlo en python.

+0

Sí, creo que está en Unicode, ¿hay alguna manera de abrir el archivo en python, convertir el archivo a ascii, escribir el archivo y luego volver a abrirlo para cargarlo como un csv? – wlindner

0

Ok, lo tengo con la ayuda del puesto de Jarret Hardie

este es el código que he utilizado para convertir el archivo a ASCII

fread = open('input.csv', 'rb').read() 
mytext = fread.decode('utf-16') 
mytext = mytext.encode('ascii', 'ignore') 
fwrite = open('input-ascii.csv', 'wb') 
fwrite.write(mytext) 

Gracias!

0

Abra el archivo en modo binario, 'rb'. Verifíquelo en un editor HEX y verifique que no haya relleno '00'. Abra el archivo en algo así como Scintilla Text Editor para verificar los caracteres presentes en el archivo.

+0

+1 por mencionar a Scintilla :) –

1

Para leer un archivo codificado, simplemente puede reemplazar open con codecs.open.

fread = codecs.open('input.csv', 'r', 'utf-16') 
0

Aquí es la manera fácil y rápida, especialmente si pitón no analizará la entrada correctamente

sed 's/ \(.\)/\1/g' 
Cuestiones relacionadas