2017-07-12 5 views
1

Ich hat eine riesige (6G) txt-Datei mit einem Windows-Kommandozeilen-Programm erzeugt (samtools.exe):Pandas lesen Ausgabe, 0xff in Position 0

.\samtools.exe mpileup -O bamfile.bam > txtfile.tsv

Die erzeugte Datei ist eigentlich eine Tabelle getrennt durch Tab. Als ich versuchte, pandas.read_table zu verwenden, um es zu öffnen, es gibt mir:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Als ich versuchte, die erste Zeile der Datei zu drucken, es ist wie folgt:
ÿþAL645882 473 N 1 ^!c I 1
Alles ist normal, außer dem erstes Zeichen Wenn ich es lese, benutze 'rb', tatsächlich ist das erste Zeichen 0xff.

Ich möchte wirklich, dass diese Tabelle als Pandas DataFrame gelesen wird, die Datei ist riesig, gibt es sowieso ich kann Python das 0xff Byte ignorieren lassen? Oder einfach das Byte in der Datei löschen?

Vielen Dank im Voraus!

Antwort

2

, der wie ein UTF-16-BOM Header sieht falsch interpretiert werden:

In [25]: with open("tmp.csv", "wb") as fp: 
    ...:  fp.write("a,b\n1,2".encode("utf-16")) 
    ...: 

In [26]: open("tmp.csv", "rb").read().decode("latin-1") 
Out[26]: 'ÿþa\x00,\x00b\x00\n\x001\x00,\x002\x00' 

In [27]: print(open("tmp.csv", "rb").read().decode("latin-1")) 
ÿþa,b 
1,2 

Also versuchen Sie könnten es als UTF-16 zu interpretieren:

In [29]: pd.read_csv("tmp.csv") 
[...] 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 

In [30]: pd.read_csv("tmp.csv", encoding='utf-16') 
Out[30]: 
    a b 
0 1 2 

(Es gibt andere Hacks Sie tun können, wenn es wirklich war nur die ersten zwei Bytes, die Probleme verursacht, wie Öffnen eines Dateizeigers und Lesen von zwei Bytes, aber ich vermute, wie im obigen Beispiel gibt es null Bytes in der Datei, die nicht sofort offensichtlich sind, und so es ist am besten zu benutzen . Statt die richtige Codierung)

+0

Das funktioniert! Ich denke, Windows Powershell schreibt jetzt seine Ausgabe als "UTF-16". Ich versuchte eine andere "ls" Ausgabe in Powershell. Notepad ++ meldet, dass die Ausgabedatei die UCS-2 LE BOM-Codierung verwendet, die eine UTF-16-Codierung ist. – snail123815

0

Es könnte für windows7 arbeiten spyder3.6 data=pd.read_csv("C:/Users/Manjeesh/all_state_cancer.csv",encoding='iso-8859-1')

UnicodeDecodeError: 'utf-8' Codec kann nicht Byte 0x85 in Position dekodieren 607: ungültiger Start-Byte

Ergebnis :

:data=pd.read_csv("C:/Users/Manjeesh/all_state_cancer.csv",encoding='iso-8859-1') 

data 
Out[207]: 
    s.no   user.location \ 
0  1    Ahmedabad 
1  2 Madhya Pradesh, India 
2  3   Shahdol (MP)  
3  4   Shahdol (MP)  
4  5    Ahmedabad 
5  6  Bengaluru, India 
6  7 Madhya Pradesh, India 
+0

Sie müssen besser erklären, wie dies das Problem löst. Liegt es daran, dass dieses Byte ein 'iso-8859-1' Zeichen ist? – melwil