为什么python2显示\ r(原始转义)而python3没有显示?

时间:2018-08-02 08:40:47

标签: python string escaping

我一直遇到路径错误: 找不到文件或目录 。经过数小时的调试,我意识到python2在每一行的末尾添加了一个不可见的'\r'

输入:(trainval.txt)

Images/K0KKI1.jpg Labels/K0KKI1.xml
Images/2KVW51.jpg Labels/2KVW51.xml
Images/MMCPZY.jpg Labels/MMCPZY.xml
Images/LCW6RB.jpg Labels/LCW6RB.xml

我用来调试错误的代码

with open('trainval.txt', "r") as lf:
 for line in lf.readlines():
  print ((line),repr(line))
  img_file, anno = line.strip("\n").split(" ")
  print(repr(img_file), repr(anno))

Python2输出:

("'Images/K0KKI1.jpg'", "'Labels/K0KKI1.xml\\r'")
('Images/2KVW51.jpg Labels/2KVW51.xml\r\n', "'Images/2KVW51.jpg Labels/2KVW51.xml\\r\\n'")
("'Images/2KVW51.jpg'", "'Labels/2KVW51.xml\\r'")
('Images/MMCPZY.jpg Labels/MMCPZY.xml\r\n', "'Images/MMCPZY.jpg Labels/MMCPZY.xml\\r\\n'")
("'Images/MMCPZY.jpg'", "'Labels/MMCPZY.xml\\r'")
('Images/LCW6RB.jpg Labels/LCW6RB.xml\r\n', "'Images/LCW6RB.jpg Labels/LCW6RB.xml\\r\\n'")
("'Images/LCW6RB.jpg'", "'Labels/LCW6RB.xml\\r'")

Python3输出:

Images/K0KKI1.jpg Labels/K0KKI1.xml
 'Images/K0KKI1.jpg Labels/K0KKI1.xml\n'
'Images/K0KKI1.jpg' 'Labels/K0KKI1.xml'
Images/2KVW51.jpg Labels/2KVW51.xml
 'Images/2KVW51.jpg Labels/2KVW51.xml\n'
'Images/2KVW51.jpg' 'Labels/2KVW51.xml'
Images/MMCPZY.jpg Labels/MMCPZY.xml
 'Images/MMCPZY.jpg Labels/MMCPZY.xml\n'
'Images/MMCPZY.jpg' 'Labels/MMCPZY.xml'
Images/LCW6RB.jpg Labels/LCW6RB.xml
 'Images/LCW6RB.jpg Labels/LCW6RB.xml\n'
'Images/LCW6RB.jpg' 'Labels/LCW6RB.xml'

确实令人讨厌的是,导致路径错误的是这么小的'\r'。在编写上面的脚本之前,我无法在控制台中看到它。我的问题是:为什么'\r'仍然在那里?我没有创建它。某处将其添加到那里。如果有人可以告诉我这个小的'r'的用途,这会很有帮助,为什么它出现在python2中而不是出现在python3中,以及如何避免由于它而导致错误。

1 个答案:

答案 0 :(得分:2)

Python 2和3版本的Windows文本文件之间的处理可能存在细微差别。

这里的问题是您的文件具有Windows文本格式,并且在换行之前包含一个或多个回车符。快速而通用的解决方案是更改:

img_file, anno = line.strip("\n").split(" ")

通过:

img_file, anno = line.split()

没有参数str.split的人非常聪明:

  • 它根据任何一种空白(换行,空格,回车,制表符)进行拆分
  • 它将删除空白字段(毕竟不需要strip

因此,除非您确实需要特定的拆分操作,否则请使用该跨平台/ python版本不可知形式,并且您的问题将是历史。

顺便说一句,不要for line in lf.readlines():,而只是for line in lf:,它将逐行读取并产生行,当文件很大时非常方便,这样您就不会消耗太多内存