我想创建一个包含多个“页面”的文本文件,并将每个页面的字节偏移量记录在一个单独的文件中。为此,我将字符串打印到主输出文件并使用 bytes_written += file.write(str)
计算字节数。但是,字节偏移量经常是错误的。
我切换到 bytes_written += os.write(fd, bytes(str, 'UTF-8'))
现在它可以工作了。 write()
和 os.write()
有什么区别?或者返回值的差异仅仅是由于我将字符串手动转换为 UTF-8?
最佳答案
What is the difference between
write()
andos.write()
?
这类似于C函数之间的区别fwrite(3)
和 write(2)
.
后者是操作系统级 system call 的精简包装器,而前者是标准 C 库的一部分,它会进行一些额外的缓冲,并在实际需要将其缓冲数据写入 file descriptor 时最终调用后者。 .
Python 3.x 向 file
对象的 write()
方法添加了一些额外的逻辑,该方法为 Python str
执行自动字符编码转换对象,而 Python 2.x 没有。
Or is the difference in the return value simply due to my manual conversion of the string to UTF-8?
在 Python 3.x 中,差异更多地与打开文件的方式有关。
如果您以二进制模式打开文件,例如f = open(filename, 'wb')
然后 f.write()
需要一个 bytes
对象,并将返回 bytes 写入。
相反,如果您以文本模式打开文件,例如f = open(filename, 'w')
然后 f.write()
需要一个 str
对象,并返回 characters written,对于UTF-8等多字节编码,可能与写入的字节数不匹配。
请注意,os.write()
方法总是需要一个 bytes
对象,无论是否使用了 O_BINARY
标志调用 os.open()
。
关于Python 3 : write method vs. os.write 返回的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38084573/