2011-12-31 4 views
3

У меня есть текстовый файл, содержащего вывод рекурсивного списка каталогов, как правило, выглядит следующим образом:неэкранированные имена файлов, сгенерированные Ls -R

./subfolder/something with spaces: 
something\ with\ spaces.txt* 
something\ with\ spaces.dat* 

./subfolder/yet another thing: 
yet\ another\ thing.txt* 
yet\ another\ thing.dat* 

мне нужно, чтобы получить список полных путей к каждому .txt файл:

./subfolder/something with spaces/something with spaces.txt 
./subfolder/yet another thing/yet another thing.txt 

Я почти получил решение для этого, но то, что это лучшее решения для неэкранированных имен файлов в Python? Я не знаю точно, какие символы ls -R экранированы (пробел и = два таких символа). К сожалению, у меня нет доступа к диску, содержащему эти файлы, поэтому, к сожалению, использование лучшей команды для получения списка не может быть и речи.

+1

Конечно, вы бы лучше не обрабатывать вывод 'Ls -r' но есть Python генерировать список имена файлов напрямую. Для этого должны быть модули, но я пользователь Perl, а не Python, поэтому я не могу сказать вам, что они называются. Поиск Google с помощью термина «поиск в каталоге python» предоставляет множество полезных мест для поиска. –

+0

@ Jonathan OP уже упоминал, что у него нет доступа к приводу, поэтому такие вещи, как 'walk', здесь не помогают. –

+0

Пропустил это ... ну ... жизнь - это ад. –

ответ

1

Я не уверен, что для этого есть встроенное средство, но может использоваться простое регулярное выражение.

re.sub(r'(?<!\\)\\', '', filename) 

Это приведет к удалению всех обратных косых черт (за исключением следующих следов с обратной косой чертой). Это похоже на поведение, когда вы пытаетесь и echo эти значения на терминале (я тестировал это только в bash).

bash-3.2$ echo foo\\bar 
foo\bar 
bash-3.2$ echo foo\ bar 
foo bar 
bash-3.2$ echo foo\=bar 
foo=bar 

Вот полный пример питон:

import re 

def unescape(filename): 
    return re.sub(r'(?<!\\)\\', '', filename) 

print unescape(r'foo\ bar') 
print unescape(r'foo\=bar') 
print unescape(r'foo\\bar') 

Выход:

foo bar 
foo=bar 
foo\bar 
Смежные вопросы