python - 为什么 python2 显示\r(原始转义)而 python3 不显示?

标签 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 中,以及如何避免因此而出现错误,那将会很有帮助。

最佳答案

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: ,它会读取并产生第一行一个,当文件很大时很方便,这样你就不会消耗太多内存。

关于python - 为什么 python2 显示\r(原始转义)而 python3 不显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51649215/

相关文章:

python - 在 Pythonscript 中获取 Netcat 的输出

python - 模板和请求上下文中的 Turbogears 请求/用户对象

python - 创建slots对象实例性能

iOS:本地化多行字符串文字

string - 字符串的 meshgrid 等价物

php - 在带字符串的 onclick 事件中需要转义什么?

python - Discord.py:如何修复 "event loop is closed"

string - Z3 字符串 : finding the API

python - 正则表达式中的逐字上下文

Lua 忽略转义序列