我几个小时以来一直遇到路径错误:找不到文件或目录。经过几个小时的调试,我意识到 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/