Как я могу найти все файлы в каталоге, имеющем расширение .txt
в Python?
1043
Вы можете использовать glob
:
import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
print(file)
или просто os.listdir
:
import os
for file in os.listdir("/mydir"):
if file.endswith(".txt"):
print(os.path.join("/mydir", file))
или если вы хотите просмотреть каталог, используйте os.walk
:
import os
for root, dirs, files in os.walk("/mydir"):
for file in files:
if file.endswith(".txt"):
print(os.path.join(root, file))
for file in f
чем для,for files in f
поскольку в переменной есть одно имя файла. Еще лучше было бы изменить ,f
чтобыfiles
и тогда для петель может статьfor file in files
.file
это не зарезервированное слово, а просто имя предопределенной функции, поэтому вполне возможно использовать его в качестве имени переменной в вашем собственном коде. Хотя это правда, что обычно следует избегать подобных столкновений,file
это особый случай, потому что вряд ли когда-либо понадобится его использовать, поэтому его часто считают исключением из руководящих принципов. Если вы не хотите этого делать, PEP8 рекомендует добавить к таким именам единичное подчеркивание, т. Е.file_
, С которым вы согласитесь, все еще вполне читабельно.Используйте шар .
источник
glob
не можете найти файлы рекурсивно, если ваш питон меньше 3.5. больше информацииНечто подобное должно делать работу
источник
root, dirs, files
вместоr, d, f
. Гораздо более читабельно.Примерно так будет работать
источник
os.path.join
на каждом элементеtext_files
. Это может быть что-то вродеtext_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt')]
.Вы можете просто использовать
pathlib
s 1 :glob
или в цикле:
Если вы хотите, чтобы это было рекурсивно, вы можете использовать
.glob('**/*.txt)
1
pathlib
модуль был включен в стандартной библиотеке в Python 3.4. Но вы можете установить обратные порты этого модуля даже в старых версиях Python (например, используяconda
илиpip
):pathlib
иpathlib2
.источник
**/*.txt
не поддерживается старыми версиями Python. Так что я решил это с:foundfiles= subprocess.check_output("ls **/*.txt", shell=True)
for foundfile in foundfiles.splitlines():
print foundfile
pathlib
можно сделать, и я уже включил требования к версии Python. :) Но если ваш подход еще не опубликован, почему бы просто не добавить его в качестве другого ответа?rglob
если вы хотите искать элементы рекурсивно. Например.rglob('*.txt')
источник
Мне нравится os.walk () :
Или с генераторами:
источник
Вот больше версий того же самого, которые дают немного отличающиеся результаты:
glob.iglob ()
glob.glob1 ()
fnmatch.filter ()
источник
glob1()
это вспомогательная функция вglob
модуле, которого нет в документации по Python. Есть несколько встроенных комментариев, описывающих, что он делает в исходном файле, смотрите.../Lib/glob.py
.glob.glob1()
не публично, но доступно на Python 2.4-2.7; 3.0-3.2; PyPy; jython github.com/zed/test_glob1glob
модуля.path.py является еще одной альтернативой: https://github.com/jaraco/path.py
источник
for f in p.walk(pattern='*.txt')
пройти через все подпапкиlist(p.glob('**/*.py'))
Python v3.5 +
Быстрый метод с использованием os.scandir в рекурсивной функции. Поиск всех файлов с указанным расширением в папке и подпапках.
Обновление апреля 2019
Если вы ищете в каталогах, которые содержат файлы 10 000, добавление в список становится неэффективным. «Сдача» результатов - лучшее решение. Я также включил функцию для преобразования выходных данных в Pandas Dataframe.
источник
В Python есть все инструменты для этого:
источник
all_txt_files = list(filter(lambda x: x.endswith('.txt'), os.listdir(the_dir)))
Чтобы получить все имена файлов «.txt» в папке «dataPath» в виде списка Pythonic:
источник
Попробуйте это, он найдет все ваши файлы рекурсивно:
источник
**
. Доступно только в Python 3. Что мне не нравится, так этоchdir
часть. В этом нет необходимости.filepath = os.path.join('wallpaper')
а затем использовать его какglob.glob(filepath+"**/*.psd", recursive = True)
, что даст тот же результат.источник
Я провел тест (Python 3.6.4, W7x64), чтобы выяснить, какое решение является самым быстрым для одной папки, без подкаталогов, чтобы получить список полных путей к файлам с определенным расширением.
Короче говоря, эта задача
os.listdir()
является самой быстрой и в 1,7 раза быстрее следующей:os.walk()
(с перерывом!), В 2,7pathlib
раза быстрее, в 3,2 раза быстрееos.scandir()
и в 3,3 раза быстрееglob
.Помните, что эти результаты изменятся, когда вам понадобятся рекурсивные результаты. Если вы копируете / вставляете один метод ниже, пожалуйста, добавьте .lower (), иначе .EXT не будет найден при поиске .ext.
Результаты:
источник
Этот код делает мою жизнь проще.
источник
Используйте fnmatch: https://docs.python.org/2/library/fnmatch.html.
источник
Чтобы получить массив имен файлов «.txt» из папки «data» в том же каталоге, я обычно использую эту простую строку кода:
источник
Я предлагаю вам использовать fnmatch и верхний метод. Таким образом, вы можете найти любое из следующего:
,
источник
Вот один с
extend()
источник
.txt
:)Функциональное решение с подкаталогами:
источник
Если папка содержит много файлов или память является ограничением, рассмотрите возможность использования генераторов:
Вариант А: итерация
Вариант Б: Получить все
источник
Копируемое решение, похожее на ghostdog:
источник
используйте модуль Python OS для поиска файлов с определенным расширением.
простой пример здесь:
источник
Многие пользователи ответили
os.walk
ответами, которые включают все файлы, но также все каталоги и подкаталоги и их файлы.Или для одного, где вам не нужен генератор:
Если вы собираетесь использовать совпадения для чего-то другого, вы можете сделать это списком, а не выражением генератора:
источник
Простой метод с использованием
for
цикла:Хотя это можно сделать более обобщенно.
источник