Python: Traceback-codecs.charmap_decode(input,selbst.Fehler,decoding_table)[0]
Folgende code ist Beispielcode, Ziel ist nur zu Zusammenführungen von text-Dateien aus geben-Ordner und sub-Ordner. ich bin immer Traceback gelegentlich nicht so sicher, wo um zu schauen. auch brauchen etwas Hilfe, um zu verbessern den code, um zu verhindern, dass leere Zeile wird merge & display keine Linien zusammengeführt/master-Datei. Wahrscheinlich ist es eine gute Idee, vor dem Zusammenführen der Datei, etwas Aufräumen sollten, durchgeführt oder einfach nur ignoriert leere Zeile während der merging-Prozess.
Text-Datei im Ordner nicht mehr als 1000 Zeilen, sondern Aggregat master-Datei konnte von cross 10000+ Zeilen sehr leicht.
import os
root = 'C:\\Dropbox\\ans7i\\'
files = [(path,f) for path,_,file_list in os.walk(root) for f in file_list]
out_file = open('C:\\Dropbox\\Python\\master.txt','w')
for path,f_name in files:
in_file = open('%s/%s'%(path,f_name), 'r')
# write out root/path/to/file (space) file_contents
for line in in_file:
out_file.write('%s/%s %s'%(path,f_name,line))
in_file.close()
# enter new line after each file
out_file.write('\n')
with open('master.txt', 'r') as f:
lines = f.readlines()
with open('master.txt', 'w') as f:
f.write("".join(L for L in lines if L.strip()))
Traceback (most recent call last):
File "C:\Dropbox\Python\master.py", line 9, in <module> for line in in_file:
File "C:\PYTHON32\LIB\encodings\cp1252.py", line 23, in decode return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 972: character maps to <undefined>
Tritt der Fehler wirklich auftreten, in
es ist die Linie, die traceback ist ganz klar. Während des Lesens der Datei ein Fehler ausgegeben.
aber ein UnicodeDecodeError? Komisch.
es ist nicht komisch überhaupt, python 3 decodiert text-Dateien automatisch.
ahhh, Python 3. Okay dann.
for line in in_file
? Ich vermute, es ist die Zeile danach, aber nicht wirklich sicher. Können Sie testen, ob Python läuft in die Schleife?es ist die Linie, die traceback ist ganz klar. Während des Lesens der Datei ein Fehler ausgegeben.
aber ein UnicodeDecodeError? Komisch.
es ist nicht komisch überhaupt, python 3 decodiert text-Dateien automatisch.
ahhh, Python 3. Okay dann.
InformationsquelleAutor user1582596 | 2012-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wird der Fehler ausgelöst, weil Python 3 öffnet die Dateien mit einem Standard-Codierung, die nicht mit dem Inhalt.
Wenn alles, was Sie tun, ist das kopieren von Datei-Inhalt, Sie wären besser dran mit der
shutil.copyfileobj()
- Funktion zusammen mit dem öffnen der Dateien im Binär-Modus. So vermeiden Sie, Probleme der Zeichenkodierung zusammen (so lange, wie alle Ihre source-Dateien sind die gleiche Codierung natürlich, so dass Sie am Ende nicht mit einem Ziel-file mit gemischten Kodierungen):Ich habe den code aufgeräumt, ein wenig zu verwenden-Kontext-Manager (so dass Ihre Dateien automatisch geschlossen, wenn Sie fertig sind) und verwenden
os.path
erstellen Sie den vollständigen Pfad für Ihre Dateien.Wenn Sie brauchen, um Ihre Eingabe Zeile für Zeile müssen Sie sagen, Python welche Kodierung zu erwarten ist, so kann es entschlüsseln, den Inhalt der Datei in python string-Objekte:
Beachten Sie, dass dies erfordert, dass Sie wissen vorne, was die Codierung der Dateien verwenden.
Lesen, auf die Python-Unicode-HOWTO wenn Sie weitere Fragen zu python 3, - Dateien und-Kodierungen.
Nur müde mit den oben 1. code, und bekommen jetzt einige genaue Fehlermeldung, es sagt TypeError: ungültige Datei: und versuchte darauf hin, Datei. aber das merkwürdige ist, dass, das ist einfach nur eine leere Datei.
können Sie verwenden pastie.org um mir zu zeigen, das traceback?
das ist der code unten meine änderungen, wo Sie Lesen alle Zeilen in der master-Datei, um Sie auszuziehen. Werden Sie noch haben, um herauszufinden, eine Codierung für diese, oder bauen Sie einen Weg zum Lesen und schreiben von Binär-Modus, wo Sie entfernen alle Leerzeichen um Zeilenumbrüche. Siehe auch die zweite Hälfte meiner Antwort für das Teil. Umgang mit stripping-Linien im Binär-Modus wäre eine interessante neuen Frage auf Stack Overflow vielleicht.
Sie können tun, dass durch die Schleife über alle Dateinamen, drucken den Dateinamen, öffnen Sie die Datei im text-Modus (
open(filename, 'r')
, Durchlaufen Sie die Datei und Lesen Sie alle Zeilen, bis Sie die Ausnahme. Der Letzte Dateiname gedruckt wird, ist Ihre problem-Datei.InformationsquelleAutor Martijn Pieters