Python изменить расширение файла

Обновлено: 07.07.2024

Как я могу найти все файлы в каталоге с расширением .txt в python?

31 ответ

Вы можете использовать glob :

или если вы хотите перемещаться по каталогу, используйте os.walk :

Используя решение № 2, как бы вы создали файл или список с этой информацией? @ ghostdog74: По моему мнению, было бы более уместно написать for file in f чем для for files in f поскольку в переменной есть одно имя файла. Еще лучше было бы изменить f на files и тогда цикл for мог бы стать for file in files . @ ghostdog74: есть ли разница в производительности между этими параметрами? file @martineau является зарезервированным словом и не может использоваться в качестве переменной. тем не менее, возможно, более понятно сделать for f in files и переключить остальную часть кода, чтобы f был единственным файлом, а файлы - списком @computermacgyver: Нет, file - это не зарезервированное слово, а просто имя предопределенной функции, поэтому вполне возможно использовать его в качестве имени переменной в вашем собственном коде. Хотя это правда, что обычно следует избегать подобных коллизий, file - это особый случай, потому что вряд ли когда-либо понадобится его использовать, поэтому его часто считают исключением из руководства. Если вы не хотите этого делать, PEP8 рекомендует добавить к таким именам единичное подчеркивание, например, file_ , с которым, как вы согласитесь, все еще вполне читабельно. Спасибо, Мартино, ты абсолютно прав. Я слишком быстро спешил с выводами. Действительно крутой ответ, вы можете заменить r, d, f на r, _, f, чтобы избежать объявления неиспользуемых переменных. Я упал на это для файла в предложении е в моей голове тоже. Возможно, для fileName в f было бы лучше, так как мы перебираем список имен файлов, а не файловых объектов. мои пять центов - Python glob (), вероятно, отличается от системного glob. когда системный глобус завершается с ошибкой «Список аргументов слишком длинный», python glob работает нормально. @computermacgyver - Согласно pep8, вы должны добавить символ подчеркивания _ в конец имени, если это в противном случае скрыло бы встроенную функцию (если, конечно, вы не намерены скрывать встроенную функцию). Так что в этом случае вы должны использовать for file_ in files . Конечно, или f тоже работает, и это обычный выбор имени переменной для файлов в Python, так что я думаю, что это приемлемо, хотя, как правило, следует избегать очень коротких имен переменных, подобных этому. Как файлы могут быть получены ?? Мой вопрос: например, если в каталоге было n файлов с расширением .txt и какой файл был выбран первым при запуске соответствующей функции . На основании размера файла или любых других критериев? Я не знаю, как получить это . Если мне нужен файл с наибольшим размером хранилища, то как извлечь это в первую очередь ?? @Merlin, перед циклом for, инициализируйте пустой список, скажем, fileList = [], а затем замените последний оператор цикла на fileList.append (os.path.join (root, file)). Я нашел text_files = [f for f in os.listdir("/mydir") if os.path.isfile(os.path.join("/mydir", f)) and f.endswith(".txt")] работать быстрее, чем второй вариант .. os.listdir также перечисляет каталоги, поэтому, если какой-нибудь жестокий человек назовет каталог blabla.txt, он также покажет этот каталог (не только файл .txt). Используйте isfile, чтобы убедиться, что это файл. @ ghostdog74 Эй, это великолепно. Работал хорошо для меня. Спасибо! Это не только просто, но и без учета регистра. (По крайней мере, это на Windows, как и должно быть. Я не уверен насчет других ОС.) Помните, что glob не может найти файлы рекурсивно, если ваш питон меньше 3.5. больше информации лучшая часть вы можете использовать тест регулярного выражения * .txt

Что-то вроде этого должно выполнять работу

+1 для именования ваших переменных root, dirs, files вместо r, d, f . Гораздо более читабельно

Что-то вроде этого будет работать:

Или с генераторами:

Здесь больше версий, которые дают несколько разные результаты:

glob.iglob()

glob.glob1()

fnmatch.filter()

Для любопытных, glob1() - это вспомогательная функция в модуле glob которого нет в документации по Python. Есть несколько встроенных комментариев, описывающих, что он делает в исходном файле, см. . /Lib/glob.py Спасибо, это хорошая дополнительная информация для принятия решения о том, использовать ли недокументированную приватную функцию в модуле. ;-) Вот еще немного. Версия Python 2.7 имеет длину всего 12 строк и выглядит так, как будто ее легко извлечь из модуля glob .

Вы можете просто использовать pathlib glob 1 :

Если вы хотите, чтобы он был рекурсивным, вы можете использовать .glob('**/*.txt)

1 Модуль pathlib был включен в стандартную библиотеку в python 3.4. Но вы можете установить back-ports этого модуля даже в более старых версиях Python (например, используя conda или pip ): pathlib и pathlib2 .

@Roman Да, это была просто демонстрация того, что может сделать pathlib , и я уже включил требования к версии Python. :) Но если ваш подход еще не опубликован, почему бы просто не добавить его в качестве другого ответа? да, размещение ответа дало бы мне лучшие возможности форматирования, безусловно. Я постет там, потому что думаю, что это более подходящее место для этого.

У Python есть все инструменты для этого:

Этот код упрощает мою жизнь.

Чтобы получить все имена файлов .txt внутри папки 'dataPath' в виде списка на языке Pythonic

Я сделал тест (Python 3.6.4, W7x64), чтобы узнать, какое решение является самым быстрым для одной папки, а не подкаталогами, чтобы получить список полных путей к файлам с определенным расширением.

Есть ли в Python встроенная функция, которая могла бы заменить (или удалить что угодно) расширение имени файла (если оно есть)?

В моем примере: /home/user/somefile.txt станет /home/user/somefile.jpg

Не знаю, имеет ли это значение, но мне это нужно для модуля SCons, который я пишу. (Так, может быть, я могу использовать какую-то особую функцию SCons?)

Я хочу что-нибудь чистое . Совершенно .txt очевидно, что простая замена всех вхождений внутри строки не является чистой. (Это не сработает, если мое имя файла somefile.txt.txt.txt )

SCons позволяет получить файловую базу в строке действия. Можете ли вы опубликовать конкретную логику вашего бра, которая в этом нуждается? Это для экшена, эмиттера, сканера? некоторые из них, похоже, больше не работают, поскольку path возвращает PosixPath, а не строку: p

Попробуйте os.path.splitext, он должен делать то, что вы хотите.

@ S.Lott: Верьте мне или нет. Но я сделал. Я всегда делаю. Возможно, с неправильными условиями. @ereOn: Поскольку в вашем вопросе используется почти такая же формулировка, я немного удивлен, что вы не нашли его. Ваш вопрос состоит из 5 слов подряд, которые точно совпадают. Добавляйте новое имя вместе с os.path.join, чтобы оно выглядело чистым. @Tony Veijalainen: Вы не должны использовать os.path.join, потому что он предназначен для объединения компонентов пути с разделителем пути для конкретной ОС. Например, print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg') вернется /home/user/somefile/.jpg , что нежелательно. @ S.Lott - 99 человек, проголосовавших за этот ответ, довольно явно означают, что этот пост полезен, не нужно

Расширяя ответ AnaPana, как удалить расширение с помощью pathlib (Python> = 3.4):

В Real Python есть хорошее описание примеров использования модуля pathlib Это мой типичный подход, но, похоже, он не работает, когда у вас есть несколько расширений файлов. Например, pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg')) выведет 'data/foo.tar.jpg' . Я полагаю, вы можете это сделать pth.with_suffix('').with_suffix('.jpg') , но это неуклюже, и вам нужно будет добавить произвольно длинную цепочку .with_suffix('') вызовов, чтобы иметь дело с произвольным количеством точек . в расширении файла (по общему признанию, более 2 - это экзотический крайний случай). @tel Вы можете использовать while цикл, чтобы решить эту проблему: pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg') См. Мой ответ ниже, чтобы узнать о решении проблемы с несколькими расширениями.

Как сказал @jethro, splitext это аккуратный способ сделать это. Но в этом случае довольно легко разделить его самостоятельно, поскольку расширение должно быть частью имени файла, идущей после последней точки:

Есть ли встроенная функция в Python, которая заменит (или удалит, что угодно) расширение имени файла (если оно есть)?

В моем примере: /home/user/somefile.txt станет /home/user/somefile.jpg

Я не знаю, имеет ли это значение, но мне нужно это для модуля SCons, который я пишу. (Может быть, есть какая-то специальная функция SCons, которую я могу использовать?)

Мне нужно что-то очистить. Выполнение простой замены строк всех вхождений .txt внутри строки, очевидно, не является чистым. (Это не удастся, если мое имя файла somefile.txt.txt.txt )

SCons позволяет получить доступ к базе файлов в строке действия. Можете ли вы опубликовать свою логику конкретной логике, которая нуждается в этом? Это для действия, излучателя, сканера?

Попробуйте os.path.splitext, он должен делать то, что вы хотите.

@ereOn: Кроме того, в будущем, попробуйте сначала ПОИСК. Это лучше работает для ответа на такие стандартные вопросы. @S.Lott:S.Lott: Верьте мне или нет. Но я сделал. Я всегда делаю. Возможно, с неправильными условиями. @ereOn: Поскольку в вашем вопросе используется почти та же фраза, я немного удивлен, что вы его не нашли. Ваш вопрос состоит из 5 слов подряд, которые точно соответствуют. Поместите новое имя вместе с os.path.join, чтобы оно выглядело чистым. @S.LottS.Lott - 99 человек проголосовали за этот ответ довольно ясно, значит, этот пост полезен, не нужно стыдить всех

Как сказал @jethro, splitext - это аккуратный способ сделать это. Но в этом случае довольно легко разбить его самостоятельно, поскольку расширение должно быть частью имени файла, следующего за последним периодом:

Обратите внимание, что использование rsplit приведет к различным результатам для файлов, которые начинаются с точки и не имеют другого расширения (например, скрытые файлы в Linux, например, .bashrc ). os.path.splitext возвращает пустое расширение для них, но использование rsplit будет рассматривать все имя файла как расширение. Это также даст неожиданные результаты для имени файла /home/john.johnson/somefile

Расширение ответа AnaPana, как удалить расширение с помощью pathlib (Python >= 3.4):


содержание 1, основная функция MPI 2, точка-точка функция связи 3, коллективная функция связи 1, основная функция MPI MPI_Init(&argc, &argv) Информировать системы MPI для выполнения всех необх.

Примечание 9: EL выражение


JVM память

концепция Виртуальная машина JVM управляет собственной памятью, которая разделяет память во многие блоки, наиболее распространенной для памяти стека и памяти кучи. 1 структура виртуальной машины JVM H.

Проблема сетевого запроса на Android 9.0

вЗапустите Android 9 (API Уровень 28) или вышеНа устройстве операционной системы Android, чтобы обеспечить безопасность пользовательских данных и устройств, использование по умолчанию для зашифрованно.


Учебная запись по Webpack (3) В статье рассказывается о создании webpack4.0.

предисловие Для изучения веб-пакета автор также предпринял много обходных путей. Есть много вещей, которые я хочу знать, но я не могу их найти. Автор поможет вам быстро начать работу. Цель этой статьи.

Вам также может понравиться

Сетевой HDU - 3078 мультивикация LCA

The ALPC company is now working on his own network system, which is connecting all N ALPC department. To economize on spending, the backbone network has only one router for each department, and N-1 op.

Деревянная палочка Luogu P1120 [Data Enhanced Version] Поиск

Метафизический разрез, просто просмотрите поиск Я чувствую, что процедура поиска состоит в том, чтобы сначала набрать общую структуру, а затем шаг за шагом оптимизировать процесс сокращения. 1. Длина .

Используйте Maven для запуска модульных тестов

Используйте Maven для запуска модульных тестов Чтобы запустить модульные тесты через Maven, введите эту команду: Это запустит весь модульный тест в вашем проекте. Тематическое исследование Создайте дв.


Читайте также: