1

我目前正在试验 Python 3 在读取和写入数据时如何处理字节,我遇到了一个特别令人不安的问题,我似乎无法找到其根源。我基本上是从 JPEG 文件中读取字节,使用 将它们转换为整数ord(),然后使用该行将字节返回为其原始字符并将其chr(character).encode('utf-8')写回 JPEG 文件。没问题吧?好吧,当我尝试打开 JPEG 文件时,我收到一条 Windows 8.1 通知,说它无法打开照片。当我检查这两个文件时,一个是 5.04MB,另一个是 7.63MB,这让我非常困惑。

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__()

这是我正在使用的确切代码,关于正在发生的事情以及如何修复它的任何想法?

注意:我假设list(data_chunk)提供的数字列表等同于ord().

4

2 回答 2

2

这是您可能希望使用的一个简单示例:

import sys

f = open('gash.txt', 'rb')
stuff=f.read()    # stuff refers to a bytes object
f.close()

print(stuff)

f2 = open('gash2.txt', 'wb')

for i in stuff:
    f2.write(i.to_bytes(1, sys.byteorder))

f2.close()

如您所见,字节对象是可迭代的,但在for循环中我们返回了一个intin i。要将其转换为字节,我使用int.to_bytes()方法。

于 2016-04-16T16:24:36.980 回答
0

当您有一个代码点并以 UTF-8 对其进行编码时,结果可能包含比原始代码更多的字节。

具体示例,请参阅WikiPedia 页面并考虑十六进制值0xA2

这是一个单一的二进制值,小于 255,但当编码为 UTF8 时,它变为0xC2, 0xA2.

鉴于您要从源文件中提取字节,我的第一个建议是将字节直接传递给目标文件的编写者。

如果您想了解文件 I/O 的工作原理,请注意encode()使用二进制文件模式。二进制文件不需要编码或解码——它们是原始数据。

于 2016-04-16T16:25:17.840 回答