TL; DR : текстовый файл содержит строки, представляющие escape-символы обратной косой черты; как использовать их в качестве входных данных для os.stat()
?
У меня есть входной файл input.txt
:
./with\backspace
./with\nnewline
Обработка их с помощью простого цикла не работает:
>>> import os
>>> with open('input.txt') as f:
... for line in f:
... os.stat(line.strip())
...
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
FileNotFoundError: [Errno 2] No such file or directory: './with\\backspace'
Использование .decode("unicode_escape")
, как предложено в , другой вопрос работает только частично - первая строка в файле терпит неудачу, вторая с \n
не работает.
Sidenote: входные имена файлов имеют ./
, и я знаю, что могу просто использовать os.listdir('.')
и перебирать файлы, пока не найду правильные. Это не моя цель. Целью является обработка имен файлов, которые содержат экранирование от обратной косой черты из файла.
Дополнительный тест:
>>> import os
>>> with open('./input.txt') as f:
... for l in f:
... os.stat(l.strip().decode('unicode_escape'))
...
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
AttributeError: 'str' object has no attribute 'decode'
>>> with open('./input.txt') as f:
... for l in f:
... try:
... os.stat(l.strip().encode('utf-8').decode('unicode_escape'))
... print(l.strip())
... except:
... pass
...
os.stat_result(st_mode=33188, st_ino=1053469, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=0, st_atime=1536468565, st_mtime=1536468565, st_ctime=1536468565)
./with\nnewline
Написание явной строки с os.fsencode()
работает:
>>> os.stat(os.fsencode('with\x08ackspace'))
os.stat_result(st_mode=33188, st_ino=1053465, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=0, st_atime=1536468565, st_mtime=1536468565, st_ctime=1536468565)
Однако, с несколькими вариантами выполнения одной и той же команды, я все еще не могу прочитать строку из файла, так что os.stat()
принимает ее.
>>> with open('./input.txt') as f:
... for l in f:
... os.stat(os.fsdecode( bytes(l.strip(),'utf-8').decode('unicode_escape').encode('latin1') ) )
...
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
FileNotFoundError: [Errno 2] No such file or directory: './with\x08ackslash'