我想创建一个包含多个'''''''''并在单独的文件中记录每个页面的字节偏移量。为此,我将字符串打印到主输出文件并使用bytes_written += file.write(str)
计算字节数。但是,字节偏移通常是错误的。
我切换到bytes_written += os.write(fd, bytes(str, 'UTF-8'))
,现在就可以了。 write()
和os.write()
之间有什么区别?或者归因于我手动将字符串转换为UTF-8,返回值的差异是什么?
答案 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()
标记。