我一直遇到路径错误: 找不到文件或目录 。经过数小时的调试,我意识到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中,以及如何避免由于它而导致错误。
答案 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:
,它将逐行读取并产生行,当文件很大时非常方便,这样您就不会消耗太多内存