读取时将chr(13)写入文件会得到chr(10)

时间:2018-12-25 22:38:07

标签: python python-3.x io carriage-return linefeed

我有一个简单的代码让我大吃一惊:

if __name__ == '__main__':
    writen_text = chr(13)
    file = open('bug', 'w')
    file.write(writen_text)
    file.close()
    file = open('bug')
    read_text = ''.join(file.readlines())
    print([ord(c) for c in writen_text])
    print([ord(c) for c in read_text])
    assert writen_text == read_text

输出为

[13]
[10]
Traceback (most recent call last):
  File "/bug.py", line 10, in <module>
    assert writen_text == read_text
AssertionError

这是什么???我只想向文件中写入文本,然后准确读取此文本,而无需进行任何更改

Python3.6.6,Ubuntu18.04(如果重要的话)

2 个答案:

答案 0 :(得分:3)

如果您发现,以chr(10)开头的内容保持不变,并通过了断言测试。

所以真正的问题是为什么将chr(13)更改为chr(10)?为了回答这个问题,我们必须查看这些字符实际上代表什么。 chr(13)是回车符,而chr(10)是换行符。

您提到您正在使用Linux机器。 Linux使用Unix模型,在文件中使用换行符,而不使用回车符。因此,将CR字符写入文件时,系统会将其转换为系统使用的LF字符。然后,您正在读取文件(包含翻译后的字符),因此断言失败。

Here's关于收益类型差异的不错的帖子。

答案 1 :(得分:0)

jk622的答案很有用。为了避免转换,我以“ rb”模式打开文件并传递了断言:

if __name__ == '__main__':
    writen_text = chr(13)
    file = open('bug', 'w')
    file.write(writen_text)
    file.close()
    file = open('bug', 'rb')
    read_text = file.read()
    assert writen_text == str(read_text, encoding='utf-8')