Python 3 : write method vs. os.write 返回的字节数

标签 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?

最佳答案

What is the difference between write() and os.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/

相关文章:

Python:变长元组

Python 列表索引超出范围 - 算法

java - 我正在尝试保存带有递增变量的文件名

file - PhoneGap resolveLocalFileSystemURI

c# - 将文件复制到新文件夹中

Python:IndexError:列表索引超出范围仅在某些情况下发生

Python 正则表达式错误 : nothing to repeat at position 0

python - 如何从 Skit-learn DecisionTreeClassifier 获取二叉树数组

python - 使用 scipy.linalg.lstsq 的点集的最佳拟合平面结果错误?

python - 将数据库从 PMA 迁移到 Django