在python中将字节写入文件

时间:2015-03-07 19:28:12

标签: python encoding character-encoding

我正在写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

我做错了什么?

1 个答案:

答案 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上,它会将单一换行符\n0x0A)转换为" Windows样式的换行符":\r\n0x0D,{ {1}}) - 两个字符。