Ich experimentiere gerade damit, wie Python 3 beim Lesen und Schreiben von Daten Bytes handhabt, und ich bin auf ein besonders beunruhigendes Problem gestoßen, das ich anscheinend nicht finden kann. Ich lese baßweise Bytes aus einer JPEG-Datei, wandle sie unter Verwendung von ord()
in eine ganze Zahl um, gebe dann die Bytes mit der Zeile chr(character).encode('utf-8')
an ihr ursprüngliches Zeichen zurück und schreibe sie in eine JPEG-Datei zurück. Kein Problem, oder? Nun, wenn ich versuche, die JPEG-Datei zu öffnen, erhalte ich eine Windows 8.1-Benachrichtigung, dass das Foto nicht geöffnet werden kann. Wenn ich die beiden Dateien gegeneinander überprüfe, ist einer 5.04MB und der andere 7.63MB, was mich sehr verwirrt hat.Mehr Daten in Datei schreiben als lesen?
def __main__():
operating_file = open('photo.jpg', 'rb')
while True:
data_chunk = operating_file.read(64*1024)
if len(data_chunk) == 0:
print('COMPLETE')
break
else:
new_operation = open('newFile.txt', 'ab')
for character in list(data_chunk):
new_operation.write(chr(character).encode('utf-8'))
if __name__ == '__main__':
__main__()
Dies ist der genaue Code, den ich verwende, irgendwelche Ideen, was passiert und wie ich es beheben kann?
HINWEIS: Ich gehe davon aus, dass die Liste der Zahlen, die list(data_chunk)
bietet, entspricht ord()
.
Warum verwenden Sie 'liste'? Soweit ich sehen kann, wird 'data_chunk' ein Byte-Objekt sein, das auf Byte zu einem Zeitpunkt iteriert werden kann. Ich bin auch Rätsel, warum Sie uff-8 angeben. Wenn Sie Bytes lesen, möchten Sie nicht, dass sie in Zeichen konvertiert werden. – cdarke
Versuchen Sie Ihren Code auf einer viel kleineren Testdatei - es muss kein echtes JPEG sein - mit einer kleineren "Chunk-Größe", und vergleichen Sie dann die Größe und den Inhalt der beiden Dateien. Sie können auch leicht testen, ob Ihre Annahme richtig ist. Übrigens, die richtige Methode zum Öffnen einer Datei zum Lesen im Binärmodus in Python 3 ist 'open (Dateiname, 'r', newline = '')'. Es ist etwas Ähnliches zum Schreiben. – martineau
Codierung von Bytes als UTF-8 zum Schreiben einer JPEG-Datei ist falsch. Es wird jedes Byte mit einem Wert über 0x7F aufnehmen und es als mehrere Bytes codieren, wodurch die Daten beschädigt werden. –