2009-03-02 5 views
12

Ogni volta che provo ad aprire un file .csv con il comando python fread = open('input.csv', 'r') apre sempre il file con spazi tra ogni singolo carattere. Sto indovinando che è qualcosa di sbagliato con il file di testo perché posso aprire altri file di testo con lo stesso comando e vengono caricati correttamente. Qualcuno sa perché un file di testo dovrebbe caricare come questo in Python?python apre un file di testo con uno spazio tra ogni carattere

Grazie.

Aggiornamento

Ok, ho capito, con l'aiuto del post di Jarret Hardie

questo è il codice che ho usato per convertire il file in 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) 

Grazie!

risposta

14

Il post di ricorsivo ha probabilmente ragione ... il contenuto del file è probabilmente codificato con un set di caratteri multi-byte. Se questo è, in effetti, il caso è probabile che tu possa leggere il file in python stesso senza doverlo prima convertire all'esterno di python.

Prova qualcosa di simile:

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

Il flag 'b' assicura il file viene letto come dati binari. Avrai bisogno di sapere (o indovinare) la codifica originale ... in questo esempio, ho usato utf-16, ma YMMV. Questo convertirà il file in unicode. Se si ha veramente un file con caratteri multibyte, non è consigliabile convertirlo in ASCII poiché si potrebbe finire per perdere un sacco di caratteri nel processo.

MODIFICA: Grazie per aver caricato il file. Ci sono due byte nella parte anteriore del file che indicano che, in effetti, utilizza un set di caratteri ampio. Se sei curioso, apri il file in un editor esadecimale come alcuni hanno suggerito ... vedrai qualcosa nella versione di testo come "I.D. |." (eccetera). Il punto è il byte in più per ogni carattere.

Lo snippet di codice sopra sembra funzionare sulla mia macchina con quel file.

0

Non mi è mai venuto in mente, ma come ha detto truppo, deve essere qualcosa di sbagliato nel file.

Provare ad aprire il file in Excel/BrOffice Calc e Salva come il file come Csv di nuovo.

Se il problema persiste, provare un sottoinsieme dei dati: pugno 10/ultime 10/intermedie 10 righe del file.

1

Non è csv un semplice file txt con valori separati da virgola. Basta provare ad aprirlo con un editor di testo per vedere se il file è stato formato correttamente.

+0

bene, si tratta di un file di testo e correttamente formattata con | caratteri invece di virgole, ma il problema è in realtà prima che io provi a leggerlo nel lettore csv. – wlindner

0

Si potrebbe anche caricare il file in questione in un sito come http://drop.io/ e darci un collegamento.

+0

http://drop.io/nbcacm5 – wlindner

7

Il file è codificato in una codifica Unicode, ma lo stai leggendo come ascii. Prova a convertire il file in ascii prima di usarlo in python.

+0

sì, penso che sia in unicode, c'è un modo per aprire il file in python, convertire il file in ascii, scrivere il file, quindi riaprirlo per caricarlo come csv? – wlindner

0

Ok, ho capito, con l'aiuto del post di Jarret Hardie

questo è il codice che ho usato per convertire il file in 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) 

Grazie!

0

Apre il file in modalità binaria, 'rb'. Controllalo in un editor esadecimale e verifica il riempimento nullo '00'. Apri il file in qualcosa di simile a Scintilla Text Editor per verificare i caratteri presenti nel file.

+0

+1 per menzionare Scintilla :) –

1

Per leggere un file codificato, è possibile semplicemente sostituire open con codecs.open.

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

Ecco il modo semplice e veloce, specialmente se Python non analizzare correttamente l'input

sed 's/ \(.\)/\1/g' 
Problemi correlati