【问题标题】:Python 3: write method vs. os.write number of bytes returnedPython 3:write 方法与 os.write 返回的字节数
【发布时间】:2016-10-31 06:35:30
【问题描述】:

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

我切换到bytes_written += os.write(fd, bytes(str, 'UTF-8')) 现在可以使用了。 write()os.write() 有什么区别?还是仅仅因为我手动将字符串转换为 UTF-8 而导致返回值的差异?

【问题讨论】:

  • 如果您在 Windows 上,并且正在以文本模式写入文件,则将在原始字符串只有一个结尾的每一行写入两个字节 (cr+lf)。如果file.write() 在这种情况下没有正确计算字节数,我会认为这是一个错误,但无论如何可以通过确保文件以"wb" 模式打开来纠正问题。
  • 关于text文件的另一个相似点:tell返回的值不是文件中的字节索引,也不是字符索引.这只是seek 可以用来返回该位置的数字,但您不应该对此做太多事情。

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


【解决方案1】:

write()os.write() 有什么区别?

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

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

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

还是仅仅因为我手动将字符串转换为UTF-8导致返回值的差异?

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-02-13
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2018-07-11
    • 2010-12-16
    • 1970-01-01
    • 2018-04-12
    • 2018-06-18
    相关资源
    最近更新 更多