Domanda

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. Immagino sia qualcosa di sbagliato nel file di testo perché posso aprire altri file di testo con lo stesso comando e sono caricati correttamente. Qualcuno sa perché un file di testo si carica in questo modo in Python?

Grazie.

Aggiorna

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!

È stato utile?

Soluzione

Il post ricorsivo è probabilmente giusto ... il contenuto del file è probabilmente codificato con un set di caratteri multi-byte. In questo caso, infatti, è probabile che tu possa leggere il file in Python stesso senza doverlo prima convertire fuori da Python.

Prova qualcosa del tipo:

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

Il flag 'b' assicura che il file venga letto come dati binari. Dovrai conoscere (o indovinare) la codifica originale ... in questo esempio ho usato utf-16, ma YMMV. Questo convertirà il file in Unicode. Se hai davvero un file con caratteri multibyte, non ti consiglio di convertirlo in ascii in quanto potresti perdere molti caratteri nel processo.

EDIT: grazie per aver caricato il file. Ci sono due byte nella parte anteriore del file, il che indica che effettivamente utilizza un set di caratteri largo. Se sei curioso, apri il file in un editor esadecimale come alcuni hanno suggerito ... vedrai qualcosa nella versione testuale come "I.D. |." (eccetera). Il punto è il byte aggiuntivo per ogni carattere.

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

Altri suggerimenti

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.

Non è CSV un semplice file txt con valori separati da virgola. Prova ad aprirlo con un editor di testo per vedere se il file è formato correttamente.

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

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

Non mi è mai venuto in mente, ma come diceva il truppo, deve esserci qualcosa di sbagliato nel file.

Prova ad aprire il file in Excel / BrOffice Calc e salva nuovamente il file come CSV.

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

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!

Apri il file in modalità binaria, 'rb'. Controllalo in un editor esadecimale e verifica la presenza di riempimento nullo '00'. Apri il file in qualcosa come Scintilla Text Editor per controllare i caratteri presenti nel file.

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

sed 's/ \(.\)/\1/g'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top