我正在写bittorrent客户端。它可以从同行下载片段,但我无法正确地将文件写入文件。问题是编码。由于错误的编码,客户端正在将错误的字节写入文件。我找到了名为“unicode_internal”的编码。这似乎是正确的,但问题并没有消失。尽管片段大小不变(16384字节),但有时文件大小会增加16386左右。 这是我写文件的方式。没什么特别的。
with open(path, 'a', encoding='unicode_internal') as f:
f.seek(offset, 0)
f.write(data.decode('unicode_internal'))
我试图以'rb'模式打开文件,但它无济于事。 来自工作客户的stdout的一部分:
piece size: 16384
sum of pieces lengths: 49152
filesize: 49152
piece size: 16384
sum of pieces lengths: 65536
filesize: 65536
piece size: 16384
sum of pieces lengths: 81920
filesize: 81922 #Here it is. Size increased by 16386 bytes. The piece size is 16384
piece size: 16384
sum of pieces lengths: 98304
filesize: 98306
我做错了什么?
答案 0 :(得分:1)
您需要在写bytes
处以二进制模式打开文件:
data = bytes(...) # some data in bytes type
with open(path, 'ab') as f:
f.seek(offset, 0)
f.write(data)
在文本模式下打开时,独立于使用的编码,Python可以使用行结尾进行转换。例如。在Windows上,它会将单一换行符\n
(0x0A
)转换为" Windows样式的换行符":\r\n
(0x0D
,{ {1}}) - 两个字符。