将更多数据写入文件而不是读取?
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()
。二进制文件不需要编码和/或解码 - 它们是原始数据。
我目前正在试验 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()
。二进制文件不需要编码和/或解码 - 它们是原始数据。