我有一个简单的代码让我大吃一惊:
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(如果重要的话)
答案 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')