Python liest aus einer Datei und speichert in utf-8

79

Ich habe Probleme beim Lesen aus einer Datei, beim Verarbeiten ihrer Zeichenfolge und beim Speichern in einer UTF-8-Datei.

Hier ist der Code:

try:
    filehandle = open(filename,"r")
except:
    print("Could not open file " + filename)
    quit() 

text = filehandle.read()
filehandle.close()

Ich verarbeite dann den variablen Text.

Und dann

try:
    writer = open(output,"w")
except:
    print("Could not open file " + output)
    quit() 

#data = text.decode("iso 8859-15")    
#writer.write(data.encode("UTF-8"))
writer.write(text)
writer.close()

Dies gibt die Datei perfekt aus, aber laut meinem Editor in ISO 8859-15. Da derselbe Editor die Eingabedatei (im variablen Dateinamen) als UTF-8 erkennt, weiß ich nicht, warum dies passiert ist. Soweit meine Forschung gezeigt hat, sollten die kommentierten Zeilen das Problem lösen. Wenn ich diese Zeilen verwende, enthält die resultierende Datei jedoch hauptsächlich Kauderwelsch in Sonderzeichen, Wörter mit Tilde, da der Text spanisch ist. Ich würde mich über jede Hilfe sehr freuen, da ich ratlos bin ...

aarelovich
quelle
2
Welcher Editor ist das? Welche Python-Version? Von hier aus scheint dieser Code vollständig gültig zu sein und sollte wie erwartet funktionieren…
Filmor
Kate ist der Herausgeber. Die Ausgabe von Python
Version
Ich habe Ihren Code mit 2.6.8, 2.7.5+ und 3.3.2+ getestet. Alles funktioniert einwandfrei. Könnten Sie einige Beispieleingaben machen?
Null323
Da der Text in Rohbytes verarbeitet wurde, hat der unsichtbare Verarbeitungscode wahrscheinlich die UTF8-Codierung durcheinander gebracht.
Mark Tolonen
3
OK. Ich habe es gelöst. Es war größtenteils meine Schuld, also tut mir allen leid. Hier ist was passiert ist. Der von @MarkTolonen bereitgestellte Code funktionierte, wenn ich beim Öffnen der Datei iso-8859-15 anstelle von utf-8 ändere. Als mein Editor die Datei aus dem Speicher aktualisierte, nachdem er bereits die alte Codierung geladen hatte, zeigte er mir den Kauderwelsch. Als ich die Datei wieder öffnete, zeigte es mir gut. Vielen Dank an alle und entschuldigen Sie die Mühe !!!
Aarelovich

Antworten:

196

Verarbeiten Sie Text zu und von Unicode an den E / A-Grenzen Ihres Programms mithilfe des codecsModuls:

import codecs
with codecs.open(filename, 'r', encoding='utf8') as f:
    text = f.read()
# process Unicode text
with codecs.open(filename, 'w', encoding='utf8') as f:
    f.write(text)

Bearbeiten: Das ioModul wird jetzt anstelle von Codecs empfohlen und ist mit der Python 3- openSyntax openkompatibel. Wenn Sie Python 3 verwenden, können Sie es nur verwenden, wenn Sie keine Python 2-Kompatibilität benötigen.

import io
with io.open(filename, 'r', encoding='utf8') as f:
    text = f.read()
# process Unicode text
with io.open(filename, 'w', encoding='utf8') as f:
    f.write(text)
Mark Tolonen
quelle
6
Ich habe genau das getan, was du mir gesagt hast. Gleicher Fehler wie bei dem anderen Vorschlag
aarelovich
1
Ich muss es funktionieren lassen. Problem war die ursprüngliche Datei war iso-8859-15
aarelovich
10
Für alle, die dazu kommen, beachten Sie bitte, dass für Python3 open()und io,open()die gleichen sind. Einfach benutzen open(). Schauen Sie sich die Hilfe an (öffnen) und Sie werden sehen, dass sie mit io.open () identisch ist - sogar in der Überschrift steht Hilfe zu der im Modul io geöffneten integrierten Funktion.
Shawn Mehan
1
@arturomp Es würde auch nicht funktionieren. io.openerwartet, dass Unicode-Zeichenfolgen geschrieben werden, keine Byte-Zeichenfolgen. Es führt die Codierung mit der deklarierten Codierung durch.
Mark Tolonen
1
@arturomp Korrektur, es funktioniert nicht unter Python 3. Python 2 konvertiert die Byte-Zeichenfolge implizit mit dem Standardcodec zurück in Unicode ascii, sodass es funktioniert, solange die Zeichenfolge nur ASCII ist. Das ist der Grund, warum Python 3 es geändert hat ... es verhindert, dass "es manchmal funktioniert", was ein nerviger Fehler ist, der aufgespürt werden muss.
Mark Tolonen
10

Sie können es auch mit dem folgenden Code durchstehen:

file=open(completefilepath,'r',encoding='utf8',errors="ignore")
file.read()
Siva Kumar
quelle
4

Sie können das nicht mit open machen. Verwenden Sie Codecs.

Wenn Sie eine Datei in Python mit der integrierten Funktion zum Öffnen öffnen, lesen / schreiben Sie die Datei immer in ASCII. Um es in utf-8 zu schreiben, versuchen Sie Folgendes:

import codecs
file = codecs.open('data.txt','w','utf-8')
Fernando Freitas Alves
quelle
2
Versuchte dies und ich bekam eine Fehlermeldung: UnicodeDecodeError: 'utf8' Codec kann Byte 0xe9 in Position 57 nicht dekodieren: ungültiges Fortsetzungsbyte
aarelovich
Sparen Sie mit der utf-8-Codierung? Schauen Sie, wenn Sie aus einer anderen Datei lesen, die ASCII ist, müssen Sie sie zuerst dekodieren.
Fernando Freitas Alves
Der Code ist so, wie Sie ihn sehen. Was ich getan habe, ist, den Zeilenschreiber = open (Ausgabe, 'w') durch writer = codecs.open (Ausgabe, 'w', 'utf-8') zu
ersetzen,