2016-06-28 26 views
3

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

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

+0

如果你在Windows上,并且正在以文本模式写入文件,那么将为每一行结尾写入两个字节(cr + lf),其中原始字符串只有一行。如果在这种情况下'file.write()'不能正确地计算字节数,我会考虑这个错误,但是无论如何,通过确保文件以''wb''模式打开可以解决问题。 – kindall

+0

有关* text *文件的其他类似观点:由'tell'返回的值不是**文件中的字节索引,也不是字符索引。这只是一个“寻求”可以用来回到那个位置的数字,但你不应该做太多的事情。 – Bakuriu

回答

3

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

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

后者是OS级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对象,而不管是否将O_BINARY标志的主叫os.open()当使用。