将更多数据写入文件而不是读取?

Writing more data to file than reading?

我目前正在试验 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()

这是一个您可能希望尝试的简单示例:

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

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

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

具体例子参考WikiPedia page,考虑十六进制值0xA2

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

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

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