2013-09-06 2 views
36

Ich möchte meine file.txt öffnen und alle Daten aus dieser Datei teilen.Split-Funktion hinzufügen: xef xbb xbf ... n zu meiner Liste

Hier ist meine file.txt:

some_data1 some_data2 some_data3 some_data4 some_data5 

und hier ist meine Python-Code:

>>>file_txt = open("file.txt", 'r') 
>>>data = file_txt.read() 
>>>data_list = data.split(' ') 
>>>print data 
some_data1 some_data2 some_data3 some_data4 some_data5 
>>>print data_list 
['\xef\xbb\xbfsome_data1', 'some_data1', "some_data1", 'some_data1', 'some_data1\n'] 

Wie man hier sehen kann, wenn ich meine data_list fügt es zu meiner Liste dieser Druck: \xef\xbb\xbf und dies: \n. Was sind das und wie kann ich meine Liste von ihnen reinigen?

Danke.

+0

Wenn Sie kein Argument für "str.split" angeben, wird es auf alle Arten von Leerzeichen aufgeteilt (in beliebiger Kombination) und als Nebeneffekt wird der Zeilenumbruch am Ende Ihrer Einzeilendatei gelöscht. – Blckknght

Antwort

55

Ihre Datei enthält am Anfang UTF-8 BOM.

Um es loszuwerden, dekodieren Sie zuerst Ihre Dateiinhalte zu Unicode.

fp = open("file.txt") 
data = fp.read().decode("utf-8-sig").encode("utf-8") 

Aber besser kann es nicht zu utf-8, sondern arbeiten mit unicode d Text kodieren zurück. Es gibt eine gute Regel: Dekodiert alle eingegebenen Textdaten so schnell wie möglich in Unicode und arbeitet nur mit Unicode; und Codieren der Ausgabedaten zu der erforderlichen Codierung so spät wie möglich. Dies wird Sie vor vielen Kopfschmerzen bewahren.

Um größere Dateien in einer bestimmten Codierung zu lesen, verwenden Sie io.open oder codecs.open.

Überprüfen Sie auch this.

Verwenden Sie str.strip() oder str.rstrip(), um das Zeilenumbruchzeichen \n zu entfernen.

+2

Oder öffnen Sie die Datei im utf-8-Modus mit ['io.open'] (http://docs.python.org/2/library/io.html#io.open). –

+0

Kopieren Sie den Inhalt von hier: http://pastebin.com/raw/4ptxdGex eine einfache Suche ersetzen, um es zu entfernen. –

8

Die \xef\xbb\xbf ist ein Byte Order Mark für UTF-8 - die \xis an escape sequence angibt, die nächsten beiden Zeichen eine hex-Sequenz werden die Zeichencodes darstellt.

Die \n ist ein neues Zeilenzeichen. Um dies zu entfernen, können Sie rstrip() verwenden.

data.rstrip() 
data_list = data.split(' ') 

die Bytereihenfolgemarkierung zu entfernen, Sie io.open verwenden können (vorausgesetzt, Sie 2.6 oder 2.7 verwenden), um die Datei in utf-8 Modus zu öffnen. Beachten Sie, dass es etwas langsamer sein kann, da es in Python implementiert ist. Wenn Geschwindigkeit oder ältere Versionen von Python erforderlich sind, werfen Sie einen Blick auf codecs.open.

so etwas wie dieses Versuchen:

import io 

# Make sure we don't lose the list when we close the file 
data_list = [] 

# Use `with` to ensure the file gets cleaned up properly 
with io.open('file.txt', 'r', encoding='utf-8') as file: 
    data = file.read() # Be careful when using read() with big files 
    data.rstrip() # Chomp the newline character 
    data_list = data.split(' ') 

print data_list 
4

Wie die anderen erwähnt, Sie mit einer Datei handelt, die UTF-8 BOM am Anfang enthält.

Sie alle sagen Ihnen, wie man damit umgeht oder es direkt entfernt.

ABER, wenn Sie zufällig mit nur einer statischen Datei (oder einer kleinen statischen Reihe von ihnen) arbeiten müssen, möchten Sie möglicherweise die BOM vollständig entfernen, so dass Sie einfach nicht damit umgehen müssen.

In der Tat, die meisten Texteditoren können Sie von einer Codierung zu einer anderen konvertieren und manchmal UTF-8 und UTF-8 mit BOM sind separat aufgeführt.

Das erste, was mir in den Sinn kommt (aber es gibt viele) ist Notepad ++. Gehen Sie einfach in Encoding> In UTF-8 konvertieren ohne BOM, speichern Sie die Datei und Sie sind eingestellt.

Verwandte Themen