向文件写入的数据比读取的数据多?

2024-06-17 12:45:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在试验python3在读写数据时如何处理字节,我遇到了一个特别麻烦的问题,我似乎找不到问题的根源。我基本上是从JPEG文件中读取字节,使用ord()将它们转换成整数,然后使用chr(character).encode('utf-8')行将字节返回到原始字符,并将其写回JPEG文件。没问题吧?当我尝试打开JPEG文件时,我收到一个windows8.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()。你知道吗


Tags: 文件data字节mainoperatingmbopenutf
2条回答

当您有一个代码点并用UTF-8编码时,结果可能比原始的包含更多的字节。你知道吗

对于一个具体的例子,请参考WikiPedia page并考虑十六进制值0xA2。你知道吗

这是一个二进制值,小于255,但当编码为UTF8时,它变成0xC2, 0xA2。你知道吗

考虑到要从源文件中提取字节,我的第一个建议是直接将字节传递给目标文件的编写器。你知道吗

如果您试图理解文件I/O是如何工作的,那么在使用二进制文件模式时要小心encode()。二进制文件不需要编码或解码-它们是原始数据。你知道吗

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

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对象是iterable,但是在for循环中,我们在i中得到了一个int。要将其转换为字节,我使用int.to_bytes()方法。你知道吗

相关问题 更多 >