Python 3:写入方法与os.write返回的字节数

时间:2016-06-28 19:18:07

标签: python file python-3.x utf-8

我想创建一个包含多个'''''''''并在单独的文件中记录每个页面的字节偏移量。为此,我将字符串打印到主输出文件并使用bytes_written += file.write(str)计算字节数。但是,字节偏移通常是错误的。

我切换到bytes_written += os.write(fd, bytes(str, 'UTF-8')),现在就可以了。 write()os.write()之间有什么区别?或者归因于我手动将字符串转换为UTF-8,返回值的差异是什么?

1 个答案:

答案 0 :(得分:5)

  

write()os.write()之间的区别是什么?

这类似于C函数fwrite(3)write(2)之间的差异。

后者是围绕操作系统级system call的瘦包装,而前者是标准C库的一部分,后者执行一些额外的缓冲,并在实际需要编写缓冲时最终调用后者数据到file descriptor

Python 3.x为file对象的write()方法添加了一些额外的逻辑,该方法为Python str对象进行自动字符编码转换,而Python 2.x则没有。 / p>

  

或者归因于我手动将字符串转换为UTF-8而导致返回值的差异?

在Python 3.x中,差异与打开文件的方式有关。

如果您以二进制模式打开文件,例如f = open(filename, 'wb')然后f.write()需要bytes个对象,并会返回写入的字节的数量。

相反,如果您以文本模式打开文件,例如f = open(filename, 'w')然后f.write()需要一个str对象,并会返回写入的字符的数量,这对于UTF-8等多字节编码可能不匹配写入的字节数。

请注意,os.write()方法始终需要bytes个对象,无论在调用O_BINARY时是否使用了os.open()标记。