Python: объединение нескольких подкаталогов для поиска файлов, содержащих определенную строку [duplicate]

Два возможных подхода.

1 / Я не думаю, что popen() является частью стандарта C ++ (это часть POSIX из памяти), но он доступен для всех UNIX, с которыми я работал ( и вы, кажется, нацелились на UNIX, так как ваша команда «./some_command»).

2 / В случае, если нет popen(), вы можете использовать system( "./some_command >/tmp/some_command.out" ) ;, затем использовать обычный Функции ввода / вывода для обработки выходного файла.

15
задан Schack 9 May 2013 в 16:25
поделиться

3 ответа

os.walk дает вам путь к каталогу в качестве первого значения в цикле, просто используйте os.path.join() для создания полного имени файла:

shpfiles = []
for dirpath, subdirs, files in os.walk(path):
    for x in files:
        if x.endswith(".shp"):
            shpfiles.append(os.path.join(dirpath, x))

Я переименовал path в цикле в dirpath, чтобы не конфликтовать с переменной path, которую вы уже проходили до os.walk().

Обратите внимание, что вам не нужно проверять, есть ли результат .endswith() == True; if уже делает это для вас, часть == True полностью избыточна.

Вы можете использовать .extend() и выражение генератора, чтобы сделать приведенный выше код немного более компактным:

shpfiles = []
for dirpath, subdirs, files in os.walk(path):
    shpfiles.extend(os.path.join(dirpath, x) for x in files if x.endswith(".shp"))

или даже как одно понимание списка:

shpfiles = [os.path.join(d, x)
            for d, dirs, files in os.walk(path)
            for x in files if x.endswith(".shp")]
42
ответ дан Martijn Pieters 19 August 2018 в 14:42
поделиться
  • 1
    Спасибо за помощь! Наверное, это было легче, чем я думал. – Schack 9 May 2013 в 16:35

Кажется, os.path.abspath(finename) будет работать. Попробуйте

shpfiles = []
for path, subdirs, files in os.walk(path):
    for x in files:
        if x.endswith(".shp") == True:
            shpfiles.append(os.path.join(path, x))
-1
ответ дан gsmaker 19 August 2018 в 14:42
поделиться
  • 1
    Нет, не будет. abspath будет содержать имя файла текущего каталога , который может быть совершенно иным путем. – Martijn Pieters♦ 9 May 2013 в 16:32
  • 2
    @Martijn: да, вы правы. – gsmaker 9 May 2013 в 16:46

Почему бы не import glob?

import glob 

print(glob.glob('F:\OTHERS\PHOTOS\Panama\\mai13*\\*.jpg') )

, и я получаю все jpeg, которые я хочу, с абсолютным путем

>>> 
['F:\\OTHERS\\PHOTOS\\Panama\\mai13\\03052013271.jpg', 
'F:\\OTHERS\\PHOTOS\\Panama\\mai13\\05052013272.jpg', 
'F:\\OTHERS\\PHOTOS\\Panama\\mai13\\05052013273.jpg']
0
ответ дан octoback 19 August 2018 в 14:42
поделиться
  • 1
    glob() поддерживает только фиксированную глубину подкаталогов, os.walk() поддерживает произвольные глубины. См. . Как искать подпапки с помощью модуля glob.glob в Python? – Martijn Pieters♦ 9 May 2013 в 16:47
  • 2
    Исходный вопрос можно интерпретировать как единый каталог. Для тех, кто читает этот ответ, который не требует подкаталогов (например, я), glob более pythonic, потому что он более краткий и дает более сразу полезный результат. – michael 25 July 2018 в 21:35
Другие вопросы по тегам:

Похожие вопросы: