Эта статья является переводом, ссылка на оригиналworking-with-files-in-python
В Python есть несколько встроенных модулей и методов для работы с файлами. Эти методы делятся, например, наos
, os.path
, shutil
иpathlib
и так далее в нескольких модулях. В этой статье будут перечислены наиболее распространенные операции и методы для файлов в Python.
В этой статье вы узнаете, как:
- Получить атрибуты файла
- Создать каталог
- соответствие шаблону имени файла
- пройтись по дереву каталогов
- Создание временных файлов и каталогов
- Удалить файлы и каталоги
- Копировать, перемещать и переименовывать файлы и каталоги
- Создание и распаковка архивов ZIP и TAR
- использовать
fileinput
Модуль открывает несколько файлов
Чтение и запись файловых данных в Python
Чтение и запись файлов с помощью Python очень просты. Для этого сначала нужно открыть файл в соответствующем режиме. Вот пример того, как открыть текстовый файл и прочитать его содержимое.
with open('data.txt', 'r') as f:
data = f.read()
print('context: {}'.format(data))
open()
принимает в качестве аргументов имя файла и шаблон,r
Указывает, что файл открыт в режиме только для чтения. Если вы хотите записать данные в файл, используйтеw
как параметр.
with open('data.txt', 'w') as f:
data = 'some data to be written to the file'
f.write(data)
В приведенном выше примере open() открывает файл для чтения или записи и возвращает дескриптор файла (в этом примереf
), который предоставляет методы, которые можно использовать для чтения или записи данных файла. читатьWorking With File I/O in PythonПолучите дополнительную информацию о том, как читать и записывать файлы.
получить список каталогов
Предположим, что в вашем текущем рабочем каталоге есть файл с именемmy_directory
подкаталог со следующим содержимым:
.
├── file1.py
├── file2.csv
├── file3.txt
├── sub_dir
│ ├── bar.py
│ └── foo.py
├── sub_dir_b
│ └── file4.txt
└── sub_dir_c
├── config.py
└── file5.txt
Встроенный Pythonos
Модули имеют множество полезных методов, которые можно использовать для отображения содержимого каталога и фильтрации результатов. Чтобы получить список всех файлов и папок для определенного каталога в файловой системе, в устаревших версиях Python можно использоватьos.listdir()
или использовать в Python 3.xos.scandir()
. Если вы также хотите получить свойства файла и каталога (например, размер файла и дату модификации), тогдаos.scandir()
является предпочтительным методом.
Получить список каталогов с устаревшей версией Python
import os
entries = os.listdir('my_directory')
os.listdir()
Возвращает список Python, содержащий имена файлов и подкаталогов каталога, на который указывает аргумент пути.
['file1.py', 'file2.csv', 'file3.txt', 'sub_dir', 'sub_dir_b', 'sub_dir_c']
Списки каталогов теперь выглядят трудночитаемыми, даos.listdir()
Использование цикла для печати результата вызова полезно для просмотра.
for entry in entries:
print(entry)
"""
file1.py
file2.csv
file3.txt
sub_dir
sub_dir_b
sub_dir_c
"""
Получите список каталогов с современной версией Python
В современных версиях Python вы можете использоватьos.scandir()
иpathlib.Path
заменитьos.listdir()
.
os.scandir()
Упоминается в Python 3.5, его документацияPEP 471.
os.scandir()
При вызове возвращает итератор вместо списка.
import os
entries = os.scandir('my_directory')
print(entries)
# <posix.ScandirIterator at 0x105b4d4b0>
ScandirIterator указывает на все записи в текущем каталоге. Вы можете перебирать содержимое итератора и печатать имя файла.
import os
with os.scandir('my_directory') as entries:
for entry in entries:
print(entry.name)
здесьos.scandir()
Используется с оператором with, поскольку он поддерживает протокол управления контекстом. Используйте диспетчер контекста, чтобы закрыть итератор и автоматически освободить полученные ресурсы после исчерпания итератора. существуетmy_directory
Результат печати имени файла такой же, как и вos.listdir()
Как видно на примере:
file1.py
file2.csv
file3.txt
sub_dir
sub_dir_b
sub_dir_c
Другой способ получить список каталогов — использоватьpathlib
Модуль:
from pathlib import Path
entries = Path('my_directory')
for entry in entries.iterdir():
print(entry.name)
pathlib.Path()
то, что возвращаетсяPosixPath
илиWindowsPath
объект, в зависимости от операционной системы.
pathlib.Path()
объект имеет.iterdir()
Метод используется для создания итератора, содержащего все файлы и каталоги в каталоге. Зависит от.iterdir()
Каждая сгенерированная запись содержит информацию о файле или каталоге, такую как его имя и атрибуты файла.pathlib
Впервые он был представлен в Python 3.4 и является хорошим усовершенствованием Python, который предоставляет объектно-ориентированный интерфейс для файловой системы.
В приведенном выше примере вы вызываетеpathlib.Path()
И передал параметр пути. тогда позвони.iterdir()
получитьmy_directory
Список всех файлов и каталогов в .
pathlib
Предоставляется набор классов, обеспечивающих наиболее распространенные операции на пути простым и объектно-ориентированным способом. использоватьpathlib
чем использоватьos
Функции в более эффективны. иos
по сравнению с использованиемpathlib
Еще одно преимущество заключается в том, что он уменьшает количество импортируемых пакетов или модулей, которые манипулируют путями файловой системы. Для получения дополнительной информации вы можете прочитатьМодуль pathlib Python 3: приручение файловой системы.
Запуск приведенного выше кода даст следующий результат:
file1.py
file2.csv
file3.txt
sub_dir
sub_dir_b
sub_dir_c
использоватьpathlib.Path()
илиos.scandir()
заменитьos.listdir()
является предпочтительным способом получения списка каталогов, особенно если вам нужно получить информацию о типе файла и атрибутах файла.pathlib.Path()
предоставлено вos
иshutil
Большинство функций этого модуля имеют дело с файлами и путями, и его методы более эффективны, чем в этих модулях. Мы обсудим, как быстро получить свойства файла.
функция | описывать |
---|---|
os.listdir() | Возвращает все файлы и папки в каталоге в виде списка |
os.scandir() | Возвращает итератор, содержащий все объекты в каталоге, объекты, содержащие информацию об атрибутах файла. |
pathlib.Path().iterdir() | Возвращает итератор, содержащий все объекты в каталоге, объекты, содержащие информацию об атрибутах файла. |
Эти функции возвращают список всего в каталоге, включая подкаталоги. Это может не всегда быть тем результатом, которого вы всегда хотели, и в следующем разделе будет показано, как отфильтровать результаты из списка каталогов.
Список всех файлов в каталоге
В этом разделе показано, как использоватьos.listdir()
,os.scandir()
иpathlib.Path()
Распечатайте имена файлов в каталоге. Чтобы отфильтровать каталог и список толькоos.listdir()
Сгенерированный файл со списком каталогов для использованияos.path
:
import os
basepath = 'my_directory'
for entry in os.listdir(basepath):
# 使用os.path.isfile判断该路径是否是文件类型
if os.path.isfile(os.path.join(base_path, entry)):
print(entry)
позвони сюдаos.listdir()
возвращает список всего содержимого по указанному пути, затем используйтеos.path.isfile()
Отфильтруйте список, чтобы отображались только типы файлов, а не типы каталогов. Результат выполнения кода следующий:
file1.py
file2.csv
file3.txt
Более простой способ перечислить все файлы в каталоге — использоватьos.scandir()
илиpathlib.Path()
:
import os
basepath = 'my_directory'
with os.scandir(basepath) as entries:
for entry in entries:
if entry.is_file():
print(entry.name)
использоватьos.scandir()
по сравнению сos.listdir()
Вроде понятнее и понятнее. правильноScandirIterator
каждый звонокentry.isfile()
, если вернутьсяTrue
Указывает, что этот элемент является файлом. Вывод приведенного выше кода выглядит следующим образом:
file1.py
file3.txt
file2.csv
Далее покажите, как использоватьpathlib.Path()
Список файлов в каталоге:
from pathlib import Path
basepath = Path('my_directory')
for entry in basepath.iterdir():
if entry.is_file():
print(entry.name)
существует.iterdir()
каждый сделанный звонок.is_file()
. Полученный результат такой же, как и выше:
file1.py
file3.txt
file2.csv
Приведенный выше код может быть более кратким, если цикл for и оператор if объединены в одно выражение генератора. Про генератор выражений порекомендуйте статьюDan Baderстатья.
Переработанная версия выглядит следующим образом:
from pathlib import Path
basepath = Path('my_directory')
files_in_basepath = (entry for entry in basepath.iterdir() if entry.is_file())
for item in files_in_basepath:
print(item.name)
Результат выполнения приведенного выше кода такой же, как и раньше. В этом разделе показано использованиеos.scandir()
иpathlib.Path()
Фильтровать файлы или каталоги, чем использоватьos.listdir()
иos.path
Более интуитивно понятный и код выглядит чище.
список подкаталогов
Если вы хотите перечислить подкаталоги вместо файлов, используйте метод ниже. Теперь покажите, как использоватьos.listdir()
иos.path()
:
import os
basepath = 'my_directory'
for entry in os.listdir(basepath):
if os.path.isdir(os.path.join(basepath, entry)):
print(entry)
когда ты звонишь несколько разos.path,join()
работа с файловой системой таким образом становится громоздкой. Запуск этого кода на моем компьютере приводит к следующему выводу:
sub_dir
sub_dir_b
sub_dir_c
Вот как использоватьos.scandir()
:
import os
basepath = 'my_directory'
with os.scandir(basepath) as entries:
for entry in entries:
if entry.is_dir():
print(entry.name)
Как и в примере в списке файлов, здесь вos.scandir()
Вызывается для каждого возвращенного элемента.is_dir()
. Если этот элемент является каталогом, тоis_dir()
Возвращает True и печатает имя каталога. Вывод такой же, как указано выше:
sub_dir_c
sub_dir_b
sub_dir
Вот как использоватьpathlib.Path()
:
from pathlib import Path
basepath = Path('my_directory')
for entry in basepath.iterdir():
if entry.is_dir():
print(entry.name)
существует.iterdir()
Вызывается для каждого элемента, возвращаемого итераторомis_dir()
Проверьте, это файл или каталог. Если элемент является каталогом, печатается его имя, а результирующий вывод такой же, как и в предыдущем примере:
sub_dir_c
sub_dir_b
sub_dir
Получить атрибуты файла
Python может легко получить атрибуты файла, такие как размер файла и время модификации. можно сделать с помощьюos.stat()
,os.scandir()
илиpathlib.Path
чтобы получить.
os.scandir()
иpathlib.Path()
Список каталогов, содержащий атрибуты файлов, можно получить напрямую. Это может быть лучше, чем использованиеos.listdir()
Более эффективно составить список файлов, а затем получить информацию об атрибутах каждого файла.
В следующем примере показано, как получитьmy_directory
Время последней модификации файла в формате . Вывод в виде метки времени:
import os
with os.scandir('my_directory') as entries:
for entry in entries:
info = entry.stat()
print(info.st_mtime)
"""
1548163662.3952665
1548163689.1982062
1548163697.9175904
1548163721.1841028
1548163740.765162
1548163769.4702623
"""
os.scandir()
вернутьScandirIterator
объект.ScandirIterator
Каждый элемент объекта имеет.stat()
метод для получения информации о файле или каталоге, на который он указывает..stat()
Предоставляется такая информация, как размер файла и время последней модификации. В приведенном выше примере код печатаетst_time
атрибут, который представляет собой время последнего изменения содержимого файла.
pathlib
Модули имеют соответствующие методы для получения информации о файле для того же результата:
from pathlib import Path
basepath = Path('my_directory')
for entry in basepath.iterdir():
info = entry.stat()
print(info.st_mtime)
"""
1548163662.3952665
1548163689.1982062
1548163697.9175904
1548163721.1841028
1548163740.765162
1548163769.4702623
"""
В приведенном выше примере цикл.iterdir()
возвращаемый итератор и вызывая каждый элемент.stat()
чтобы получить атрибуты файла.st_mtime
Свойство представляет собой значение с плавающей запятой, представляющее метку времени. чтобыst_time
Возвращаемое значение легче читать, вы можете написать вспомогательную функцию, чтобы преобразовать его вdatetime
Объект:
import datetime
from pathlib import Path
def timestamp2datetime(timestamp, convert_to_local=True, utc=8, is_remove_ms=True)
"""
转换 UNIX 时间戳为 datetime对象
:param timestamp: 时间戳
:param convert_to_local: 是否转为本地时间
:param utc: 时区信息,中国为utc+8
:param is_remove_ms: 是否去除毫秒
:return: datetime 对象
"""
if is_remove_ms:
timestamp = int(timestamp)
dt = datetime.datetime.utcfromtimestamp(timestamp)
if convert_to_local:
dt = dt + datetime.timedelta(hours=utc)
return dt
def convert_date(timestamp, format='%Y-%m-%d %H:%M:%S'):
dt = timestamp2datetime(timestamp)
return dt.strftime(format)
basepath = Path('my_directory')
for entry in basepath.iterdir():
if entry.is_file()
info = entry.stat()
print('{} 上次修改时间为 {}'.format(entry.name, timestamp2datetime(info.st_mtime)))
стать первымmy_directory
список файлов и их свойства вconvert_date()
чтобы преобразовать время последнего изменения файла, чтобы отобразить его в удобочитаемом виде.convert_date()
использовать.strftime()
Преобразование типа даты и времени в строку.
Вывод приведенного выше кода:
file3.txt 上次修改时间为 2019-01-24 09:04:39
file2.csv 上次修改时间为 2019-01-24 09:04:39
file1.py 上次修改时间为 2019-01-24 09:04:39
Синтаксис преобразования даты и времени в строки может вас запутать. Для получения дополнительной информации обратитесь к соответствующемуофициальная документация. Другой способ - читатьstrftime.org.
Создать каталог
Рано или поздно программы, которые вы пишете, должны будут создавать каталоги для хранения данных.os
иpathlib
Содержит функции для создания каталогов. Мы рассмотрим следующие способы:
метод | описывать |
---|---|
os.mkdir() | Создайте один подкаталог |
os.makedirs() | Создание нескольких каталогов, включая промежуточные каталоги |
Pathlib.Path.mkdir() | Создание одного или нескольких каталогов |
Создать единый каталог
Чтобы создать один каталог, передайте путь к каталогу в качестве аргументаos.mkdir()
:
import os
os.mkdir('example_directory')
Если каталог уже существует,os.mkdir()
броситFileExistsError
аномальный. Кроме того, вы также можете использоватьpathlib
для создания каталога:
from pathlib import Path
p = Path('example_directory')
p.mkdir()
Если путь уже существует,mkdir()
броситFileExistsError
аномальный:
FileExistsError: [Errno 17] File exists: 'example_directory'
Чтобы избежать подобных ошибок, ловите ошибки, когда они возникают, и сообщайте своим пользователям:
from pathlib import Path
p = Path('example_directory')
try:
p.mkdir()
except FileExistsError as e:
print(e)
В качестве альтернативы вы можете дать.mkdir()
входящийexist_ok=True
параметры для игнорированияFileExistsError
аномальный:
from pathlib import Path
p = Path('example_directory')
p.mkdir(exist_ok=True)
Ошибка не возникает, если каталог уже существует.
Создать несколько каталогов
os.makedirs()
иos.mkdir()
похожий. Разница между ними в том, что,os.makedirs()
Можно создавать не только отдельные каталоги, но и рекурсивно создавать деревья каталогов. Другими словами, он может создавать любые необходимые промежуточные папки, чтобы обеспечить наличие полного пути.
os.makedirs()
и работает в bashmkdir -p
похожий. Например, чтобы создать набор каталогов, таких как 2018/10/05, вы можете сделать следующее:
import os
os.makedirs('2018/10/05', mode=0o770)
Приведенный выше код создает2018/10/05
структуру каталогов и предоставить права на чтение, запись и выполнение для владельцев и групп пользователей. Режим по умолчанию0o777
, чтобы увеличить разрешения других групп пользователей. Дополнительные сведения о правах доступа к файлам и применении шаблонов см.Документация.
бегатьtree
Команда подтверждает разрешения нашего приложения:
$ tree -p -i .
.
[drwxrwx---] 2018
[drwxrwx---] 10
[drwxrwx---] 05
Приведенный выше код выводит дерево каталогов текущего каталога.tree
Обычно используется для отображения содержимого каталога в древовидной структуре. входящий-p
и-i
Параметр выводит имя каталога и информацию о правах доступа к файлам в вертикальном списке.-p
для разрешений выходного файла,-i
используется, чтобы позволитьtree
Команда создает вертикальный список без отступов.
Как видите, все каталоги имеют права доступа 770. Другой способ создать несколько каталогов — использоватьpathlib.Path
из.mkdir()
:
from pathlib import Path
p = Path('2018/10/05')
p.mkdir(parents=True, exist_ok=True)
ДаваяPath.mkdir()
перечислитьparents=True
Аргументы ключевого слова заставляют его создавать05
каталог и любые родительские каталоги, которые делают их пути действительными.
По умолчанию,os.makedirs()
иpathlib.Path.mkdir()
Вызовет, когда целевой каталог существуетOSError
. Передавая каждый раз при вызове функцииexist_ok=True
В качестве аргумента ключевого слова можно переопределить это поведение (начиная с Python 3.2).
Запуск приведенного выше кода приведет к такой структуре:
└── 2018
└── 10
└── 05
Я предпочитаю использовать при создании каталогаpathlib
, потому что я могу использовать тот же функциональный метод для создания одного или нескольких каталогов.
соответствие шаблону имени файла
После получения списка файлов в каталоге с помощью одного из описанных выше методов вы можете захотеть найти файлы, соответствующие определенному шаблону.
Вот методы и функции, которые вы можете использовать:
-
endswith()
иstartswith()
строковый метод fnmatch.fnmatch()
glob.glob()
pathlib.Path.glob()
Эти методы и функции обсуждаются ниже. Примеры в этом подразделе будутsome_directory
, который имеет следующую структуру:
.
├── admin.py
├── data_01_backup.txt
├── data_01.txt
├── data_02_backup.txt
├── data_02.txt
├── data_03_backup.txt
├── data_03.txt
├── sub_dir
│ ├── file1.py
│ └── file2.py
└── tests.py
Если вы используете оболочку Bash, вы можете создать указанную выше структуру каталогов с помощью следующей команды:
mkdir some_directory
cd some_directory
mkdir sub_dir
touch sub_dir/file1.py sub_dir/file2.py
touch data_{01..03}.txt data_{01..03}_backup.txt admin.py tests.py
это создастsome_directory
каталог и войдите в него, затем создайтеsub_dir
. следующая строка вsub_dir
Создайтеfile1.py
иfile2.py
, последняя строка использует это расширение для создания всех остальных файлов. Чтобы узнать больше о расширении оболочки, прочитайтездесь.
Используйте строковые методы
Python имеет несколько встроенныхМодифицировать и манипулировать строкамиМетоды. При сопоставлении имен файлов два метода.startswith()
и.endswith()
очень полезно. Для этого сначала получите список каталогов, а затем перейдите.
import os
for f_name in os.listdir('some_directory'):
if f_name.endswith('.txt'):
print(f_name)
найдено в приведенном выше кодеsome_directory
все файлы, перебрать и использовать.endswith()
распечатать все расширения с.txt
имя файла. Запуск кода на моем компьютере выводит следующее:
data_01.txt
data_01_backup.txt
data_02.txt
data_02_backup.txt
data_03.txt
data_03_backup.txt
использоватьfnmatch
Выполните простое сопоставление с образцом имени файла
Возможности сопоставления строковых методов ограничены.fnmatch
Существуют более продвинутые функции и методы для сопоставления с образцом. мы рассмотрим использованиеfnmatch.fnmatch()
, который поддерживает использование*
и?
Равная подстановочная функция. Например, используйтеfnmatch
Найти все в каталоге.txt
файл, вы можете сделать это:
import os
import fnmatch
for f_name in os.listdir('some_directory'):
if fnmatch.fnmatch(f_name, '*.txt'):
print(f_name)
повторятьsome_directory
список файлов и использование.fnmatch()
расширение до.txt
выполнить поиск по шаблону в файлах.
Более продвинутое сопоставление с образцом
Предположим, вы хотите найти предметы, соответствующие определенному дропу..txt
документ. Например, вы можете указать на поиск одногоdata
из.txt
файлы, набор цифр между символами подчеркивания и слово в имени файлаbackup
. какdata_01_backup
, data_02_backup
, илиdata_03_backup
.
вы можете использовать вот такfnmatch.fnmatch()
:
import os
import fnmatch
for f_name in os.listdir('some_directory'):
if fnmatch.fnmatch(f_name, 'data_*_backup.txt'):
print(f_name)
Здесь он просто распечатывает совпаденияdata_*_backup.txt
Имя файла схемы. в режиме*
будет соответствовать любому символу, поэтому запуск этого кода будет искать имена файлов, начинающиеся сdata
начинается сbackup.txt
всех текстовых файлов, как показано в следующем выводе:
data_01_backup.txt
data_02_backup.txt
data_03_backup.txt
использоватьglob
Выполнить сопоставление с образцом имени файла
Еще один полезный модуль сопоставления с образцом:glob
.
.glob()
существуетglob
Левый и правый в модуле похожиfnmatch.fnmatch()
, но сfnmach.fnmatch()
Отличие в том, что это будет.
Файлы, начинающиеся с, рассматриваются как специальные файлы.
UNIX и родственные системы используют подстановочные знаки в списках файлов, например?
и*
Указывает на полное совпадение.
Например, в оболочке UNIX используйтеmv *.py python_files
переместить все.py
файлы с расширением из текущего каталога вpython_files
. Этот*
является подстановочным знаком, представляющим любое количество символов,*.py
это полный режим. Эта функциональность оболочки недоступна в операционных системах Windows. ноglob
Модули добавляют эту функциональность в Python, делая эту функцию доступной для программ Windows.
Вот один с использованиемglob
Модуль запрашивает все файлы кода Python в текущем каталоге:
import glob
print(glob.glob('*.py'))
glob.glob('*.py')
Поиск в текущем каталоге с помощью.py
расширение и вернуть их в виде списка.glob
Подстановочные знаки в стиле оболочки также поддерживаются для сопоставления:
import glob
for name in glob.glob('*[0-9]*.txt'):
print(name)
Это найдет все текстовые файлы с номерами в именах файлов (.txt
) :
data_01.txt
data_01_backup.txt
data_02.txt
data_02_backup.txt
data_03.txt
data_03_backup.txt
glob
Также легко рекурсивно искать файлы в подкаталогах:
import glob
for name in glob.iglob('**/*.py', recursive=True):
print(name)
В этом примере используетсяglob.iglob()
Поиск в текущем каталоге и подкаталогах для всех.py
документ. перечислитьrecursive=True
в виде.iglob()
Параметр заставляет его искать текущий каталог и подкаталоги для.py
документ.glob.glob()
иglob.iglob()
Разница в том,iglob()
Возвращает итератор вместо списка.
Запуск приведенного выше кода дает следующие результаты:
admin.py
tests.py
sub_dir/file1.py
sub_dir/file2.py
pathlib
Аналогичный метод также включен для гибкого получения списка файлов. В следующем примере показано, как вы можете использовать.Path.glob()
Список с буквамиp
Список файлов того типа, с которого нужно начать.
from pathlib import Path
p = Path('.')
for name in p.glob('*.p*'):
print(name)
перечислитьp.glob('*.p*')
вернет указатель на все расширения в текущем каталоге, начинающиеся с буквыp
Объект-генератор для файла, который начинается с.
Path.glob()
и обсуждалось вышеos.glob()
похожий. Как вы видете,pathlib
смешать многоos
,os.path
иglob
Лучшие функции модуля в один модуль, что делает его простым в использовании.
Напомним, вот список функций, которые мы рассмотрим в этом разделе:
функция | описывать |
---|---|
startswith() | Проверяет, начинается ли строка с определенного шаблона, возвращая True или False |
endswith() | Проверяет, заканчивается ли строка определенным шаблоном, возвращая True или False |
fnmatch.fnmatch(filename, pattern) | Проверяет, соответствует ли имя файла этому шаблону, возвращая значение True или False. |
glob.glob() | Возвращает список имен файлов, соответствующих шаблону |
pathlib.Path.glob() | Возвращает объект-генератор, соответствующий шаблону |
Перемещаться по каталогам и обрабатывать файлы
Распространенной задачей программирования является обход дерева каталогов и манипулирование файлами в дереве каталогов. Давайте рассмотрим, как использовать встроенные функции Python.os.walk()
для достижения этой функции.os.walk()
Используется для создания имен файлов в дереве каталогов путем обхода дерева сверху вниз или снизу вверх. Для целей этого раздела мы хотим манипулировать следующим деревом каталогов:
├── folder_1
│ ├── file1.py
│ ├── file2.py
│ └── file3.py
├── folder_2
│ ├── file4.py
│ ├── file5.py
│ └── file6.py
├── test1.txt
└── test2.txt
Вот пример, показывающий, как использоватьos.walk()
Список всех файлов и каталогов в дереве каталогов.
os.walk()
По умолчанию обход каталогов осуществляется сверху вниз:
import os
for dirpath, dirname, files in os.walk('.'):
print(f'Found directory: {dirpath}')
for file_name in files:
print(file_name)
os.walk()
В каждом цикле возвращаются три значения:
- имя текущей папки
- Список подпапок в текущей папке
- Список файлов в текущей папке
На каждой итерации он печатает имена найденных подкаталогов и файлов:
Found directory: .
test1.txt
test2.txt
Found directory: ./folder_1
file1.py
file3.py
file2.py
Found directory: ./folder_2
file4.py
file5.py
file6.py
Для перемещения по дереву каталогов снизу вверх используйтеtopdown=False
аргументы ключевого слова, переданныеos.walk()
:
for dirpath, dirnames, files in os.walk('.', topdown=False):
print(f'Found directory: {dirpath}')
for file_name in files:
print(file_name)
перечислитьtopdown=False
параметр сделаетos.walk()
Сначала распечатайте файлы, которые он находит в подкаталогах:
Found directory: ./folder_1
file1.py
file3.py
file2.py
Found directory: ./folder_2
file4.py
file5.py
file6.py
Found directory: .
test1.txt
test2.txt
Как видите, программа перечисляет содержимое подкаталогов перед перечислением содержимого корневого каталога. Это полезно, если вы хотите рекурсивно удалять файлы и каталоги. В следующих разделах вы узнаете, как это сделать. по умолчанию,os.walk
Каталоги, созданные с помощью символических ссылок, не будут доступны. можно сделать с помощьюfollowlinks = True
параметры для переопределения поведения по умолчанию.
Создание временных файлов и каталогов
Python предоставляетtempfile
Модуль для простого создания временных файлов и каталогов.
tempfile
Вы можете открывать и сохранять временные данные в файлах или каталогах во время работы вашей программы.tempfile
Эти временные файлы удаляются после прекращения работы вашей программы.
Теперь давайте посмотрим, как создать временный файл:
from tempfile import TemporaryFile
# 创建一个临时文件并为其写入一些数据
fp = TemporaryFile('w+t')
fp.write('Hello World!')
# 回到开始,从文件中读取数据
fp.seek(0)
data = fp.read()
print(data)
# 关闭文件,之后他将会被删除
fp.close()
Первый шаг отtempfile
импорт модуляTemporaryFile
. Далее используйтеTemporaryFile()
метод и перейдите в режим, в котором вы хотите открыть файл, чтобы создать объектно-подобный файл. Это создаст и откроет файл, который можно использовать как область временного хранения.
В приведенном выше примере шаблонw + t
, что делаетtempfile
Создайте временный текстовый файл в режиме записи. Нет необходимости указывать имя временного файла, так как он будет уничтожен после завершения работы скрипта.
Как только файл будет записан, вы можете прочитать его и закрыть, когда закончите обработку. Как только файл будет закрыт, он будет удален из файловой системы. Если вам нужно назвать его, используйтеtempfile
сгенерированный временный файл, пожалуйста, используйтеtempfile.NamedTemporaryFile()
.
использоватьtempfile
Созданные временные файлы и каталоги хранятся в специальном системном каталоге для хранения временных файлов. Python будет искать в списке каталогов каталоги, в которых пользователь может создавать файлы.
В Windows каталоги в порядкеC:\TEMP
,C:\TMP
,\TEMP
и\TMP
. На всех остальных платформах каталоги в порядке/ tmp
,/var/tmp
и/usr/tmp
. Если ни один из вышеуказанных каталогов не существует,tempfile
Временные файлы и каталоги будут храниться в текущем каталоге.
.TemporaryFile()
Также менеджер контекста, поэтому его можно использовать с оператором with. Использование менеджера контекста автоматически закрывает и удаляет файл после его чтения:
with TemporaryFile('w+t') as fp:
fp.write('Hello universe!')
fp.seek(0)
fp.read()
# 临时文件现在已经被关闭和删除
Это создаст временный файл и прочитает данные из него. Как только содержимое файла прочитано, временный файл закрывается и удаляется из файловой системы.
tempfile
Может также использоваться для создания временных каталогов. Давайте посмотрим, как использоватьtempfile.TemporaryDirectory()
сделать это:
import tempfile
import os
tmp = ''
with tempfile.TemporaryDirectory() as tmpdir:
print('Created temporary directory ', tmpdir)
tmp = tmpdir
print(os.path.exists(tmpdir))
print(tmp)
print(os.path.exists(tmp))
перечислитьtempfile.TemporaryDirectory()
В файловой системе создается временный каталог, и возвращается объект, представляющий этот каталог. В приведенном выше примере диспетчер контекста используется для создания каталога, имя каталога хранится вtmpdir
в переменной. Третья строка выводит имя временного каталога,os.path.exists(tmpdir)
чтобы подтвердить, что каталог действительно был создан в файловой системе.
После выхода менеджера контекста из контекста временный каталог удаляется, аos.path.exists(tmpdir)
вернет False, что означает, что каталог был успешно удален.
Удалить файлы и каталоги
ты можешь использовать этоos
,shutil
иpathlib
Методы в модулях удаляют отдельные файлы, каталоги и целые деревья каталогов. Вот как удалить файлы и каталоги, которые вам больше не нужны.
удалить файл в питоне
Чтобы удалить отдельные файлы, используйтеpathlib.Path.unlink()
,os.remove()
илиos.unlink()
.
os.remove()
иos.unlink()
Семантически то же самое. нужно использоватьos.remove()
Чтобы удалить файлы, сделайте следующее:
import os
data_file = 'C:\\Users\\vuyisile\\Desktop\\Test\\data.txt'
os.remove(data_file)
использоватьos.unlink()
Удалите файлы и используйтеos.remove()
Аналогичным образом:
import os
data_file = 'C:\\Users\\vuyisile\\Desktop\\Test\\data.txt'
os.unlink(data_file)
позвонить в файл.unlink()
или.remove()
Файл удален из файловой системы. Обе функции вызовут исключение, если переданный им путь указывает на каталог, а не на файл.OSError
. Чтобы избежать этого, вы можете проверить, является ли контент, который вы хотите удалить, файлом, и выполнить операцию удаления, когда будет подтверждено, что это файл, или вы можете использовать обработку исключений для его обработки.OSError
:
import os
data_file = 'home/data.txt'
# 如果类型是文件则进行删除
if os.path.is_file(data_file):
os.remove(data_file)
else:
print(f'Error: {data_file} not a valid filename')
os.path.is_file()
экзаменdata_file
Это на самом деле файл . Если да, то по телефонуos.remove()
удали это. еслиdata_file
Если указать папку, на консоль будет выведено сообщение об ошибке.
В следующем примере показано, как использовать обработку исключений для обработки ошибок при удалении файлов:
import os
data_file = 'home/data.txt'
# 使用异常处理
try:
os.remove(data_file)
except OSError as e:
print(f'Error: {data_file} : {e.strerror}')
Приведенный выше код пытается удалить файл перед проверкой его типа. еслиdata_file
На самом деле, это не файл, то бросилOSError
будет обработано в предложении exclude, и на консоль будет выведено сообщение об ошибке. Сообщение об ошибке, напечатанное с помощьюPython f-strings формат.
Наконец, вы также можете использоватьpathlib.Path.unlink()
Удалить файлы:
from pathlib import Path
data_file = Path('home/data.txt')
try:
data_file.unlink()
except IsADirectoryError as e:
print(f'Error: {data_file} : {e.strerror}')
Это создаст файл с именемdata_file
изPath
объект, указывающий на файл. существуетdata_file
Вызов .unlink() удалитhome / data.txt
. еслиdata_file
указывает на каталог, бросаетIsADirectoryError
. Стоит отметить, что приведенная выше программа Python имеет те же права, что и пользователь, который ее запускает. Возникает, если у пользователя нет разрешения на удаление файлаPermissionError
.
удалить каталог
Стандартная библиотека предоставляет следующие функции для удаления каталогов:
- os.rmdir()
- pathlib.Path.rmdir()
- shutil.rmtree()
Чтобы удалить один каталог или папку, вы можете использоватьos.rmdir()
илиpathlib.Path.rmdir()
. Эти две функции работают только при удалении пустых каталогов. Если каталог не пуст, он выдастOSError
. Ниже показано, как удалить папку:
import os
trash_dir = 'my_documents/bad_dir'
try:
os.rmdir(trash_dir)
except OSError as e:
print(f'Error: {trash_dir} : {e.strerror}')
в настоящее время,trash_dir
уже прошлоos.rmdir()
был удален. Если каталог не пуст, на экране будет напечатано сообщение об ошибке:
Traceback (most recent call last):
File '<stdin>', line 1, in <module>
OSError: [Errno 39] Directory not empty: 'my_documents/bad_dir'
Точно так же вы также можете использоватьpathlib
Чтобы удалить каталог:
from pathlib import Path
trash_dir = Path('my_documents/bad_dir')
try:
trash_dir.rmdir()
except OSError as e:
print(f'Error: {trash_dir} : {e.strerror}')
Создано здесьPath
Объект указывает на каталог, который нужно удалить. Если каталог пуст, вызовитеPath
объект.rmdir()
метод его удаления.
удалить полное дерево каталогов
Чтобы удалить непустые каталоги и полные деревья каталогов, Python предоставляетshutil.rmtree()
:
import shutil
trash_dir = 'my_documents/bad_dir'
try:
shutil.rmtree(trash_dir)
except OSError as e:
print(f'Error: {trash_dir} : {e.strerror}')
при звонкеshutil.rmtree()
час,trash_dir
Все содержимое будет удалено. В некоторых случаях может потребоваться рекурсивное удаление пустых папок. Вы можете комбинировать, используя один из методов, рассмотренных выше.os.walk()
сделать это:
import os
for dirpath, dirnames, files in os.walk('.', topdown=False):
try:
os.rmdir(dirpath)
except OSError as ex:
pass
Это пройдёт по дереву каталогов и попытается удалить каждый найденный каталог. Если каталог не пуст, поднимите OSError и пропустите каталог. В следующей таблице перечислены функции, описанные в этом разделе:
функция | описывать |
---|---|
os.remove() | Удалить один файл, а не каталог |
os.unlink() | Как и os.remove(), функция удаляет один файл. |
pathlib.Path.unlink() | Удалить один файл, а не каталог |
os.rmdir() | удалить пустой каталог |
pathlib.Path.rmdir() | удалить пустой каталог |
shutil.rmtree() | Удалить полное дерево каталогов, можно использовать для удаления непустых каталогов. |
Копировать, перемещать и переименовывать файлы и каталоги
Питон поставляется сshutil
модуль.shutil
сокращение от утилиты оболочки. Он предоставляет множество расширенных операций с файлами для поддержки копирования, архивирования и удаления файлов и каталогов. В этом разделе вы узнаете, как перемещать и копировать файлы и каталоги.
копировать файл
shutil
Предусмотрены некоторые функции для копирования файлов. Наиболее часто используется функцияshutil.copy()
иshutil.copy2()
. использоватьshutil.copy()
Чтобы скопировать файлы из одного места в другое, сделайте следующее:
import shutil
src = 'path/to/file.txt'
dst = 'path/to/dest_dir'
shutil.copy(src, dst)
shutil.copy()
с системами на базе UNIXcp
Командовать совсем.shutil.copy(src,dst)
будет файлsrc
скопировать вdst
место, указанное в . еслиdst
является файлом, содержимое файла будет заменено наsrc
Содержание. еслиdst
это каталог, тоsrc
будет скопирован в этот каталог.shutil.copy()
Копируется только содержимое файла и права доступа к файлу. Другие метаданные, такие как время создания и изменения файла, не сохраняются.
Чтобы сохранить все метаданные файла при копировании, используйтеshutil.copy2()
:
import shutil
src = 'path/to/file.txt'
dst = 'path/to/dest_dir'
shutil.copy2(src, dst)
использовать.copy2()
Сохраняет сведения о файле, такие как время последнего доступа, биты разрешений, время последнего изменения и флаги.
копировать каталог
Несмотря на то чтоshutil.copy()
копирует только один файл, ноshutil.copytree()
Будет скопирован весь каталог и все, что в нем содержится.shutil.copytree(src,dest)
Принимает два аргумента: исходный каталог и каталог назначения для копирования файлов и папок.
Вот пример того, как скопировать содержимое одной папки в другое место:
import shutil
dst = shutil.copytree('data_1', 'data1_backup')
print(dst) # data1_backup
В этом примере.copytree()
будетdata_1
чтобы скопировать содержимоеdata1_backup
и вернитесь в целевой каталог. Целевой каталог не может уже существовать. Он будет создан без родительского каталога.shutil.copytree()
это отличный способ сделать резервную копию ваших файлов.
Перемещение файлов и каталогов
Чтобы переместить файл или каталог в другое место, используйтеshutil.move(src,dst)
.
src
файл или каталог, который нужно переместить,dst
является целью:
import shutil
dst = shutil.move('dir_1/', 'backup/')
print(dst) # 'backup'
еслиbackup/
существует, тоshutil.move('dir_1/','backup/')
будетdir_1/
перейти кbackup/
. еслиbackup/
не существует, тоdir_1/
будет переименован вbackup
.
Переименовывать файлы и каталоги
Python включает в себя для переименования файлов и каталоговos.rename(src,dst)
:
import os
os.rename('first.zip', 'first_01.zip')
Строка выше будетfirst.zip
переименован вfirst_01.zip
. Выдает, если целевой путь указывает на каталогOSError
.
Другой способ переименовать файл или каталог — использоватьpathlib
в модулеrename()
:
from pathlib import Path
data_file = Path('data_01.txt')
data_file.rename('data.txt')
нужно использоватьpathlib
Чтобы переименовать файл, сначала создайтеpathlib.Path()
Объект, содержащий путь к заменяемому файлу. Следующим шагом является вызов объекта путиrename()
И введите новое имя файла или каталога, который вы хотите переименовать.
архив
Архивация — это удобный способ упаковать несколько файлов в один файл. Двумя наиболее распространенными типами архивов являются ZIP и TAR. Вы можете писать программы на Python, которые создают архивные файлы, считывают архивные файлы и извлекают данные из архивных файлов. В этом разделе вы узнаете, как читать и записывать оба формата сжатия.
Прочитать ZIP-файл
zipfile
Модуль — это низкоуровневый модуль, являющийся частью стандартной библиотеки Python.zipfile
Имеет функции для легкого открытия и извлечения ZIP-файлов. Чтобы прочитать содержимое ZIP-файла, первое, что нужно сделать, это создатьZipFile
объект.ZipFile
объект подобен использованиюopen()
Созданный файловый объект.ZipFile
также является диспетчером контекста и поэтому поддерживает оператор with:
import zipfile
with zipfile.ZipFile('data.zip', 'r') as zipobj:
pass
создай здесьZipFile
Object, передайте имя ZIP-файла и откройте его в режиме чтения. После открытия ZIP-файла вы можете пройтиzipfile
Модули предоставляют функции для доступа к информации об архивных файлах. в примере вышеdata.zip
Архив из файла с именемdata
, который содержит в общей сложности 5 файлов и 1 подкаталог:
.
|
├── sub_dir/
| ├── bar.py
| └── foo.py
|
├── file1.py
├── file2.py
└── file3.py
Чтобы получить список файлов в архиве, перейдите наZipFile
вызов на объектnamelist()
:
import zipfile
with zipfile.ZipFile('data.zip', 'r') as zipobj:
zipobj.namelist()
Это генерирует список файлов:
['file1.py', 'file2.py', 'file3.py', 'sub_dir/', 'sub_dir/bar.py', 'sub_dir/foo.py']
.namelist()
Возвращает список имен файлов и каталогов в архиве. Чтобы получить информацию о файлах в архиве, используйте.getinfo()
:
import zipfile
with zipfile.ZipFile('data.zip', 'r') as zipobj:
bar_info = zipobj.getinfo('sub_dir/bar.py')
print(bar_info.file_size)
Это выведет:
15277
.getinfo()
вернутьZipInfo
Объект, в котором хранится информация об одном члене файла архива. Чтобы получить информацию о файле в архиве, передайте его путь в качестве параметра в.getinfo()
. использоватьgetinfo()
, вы можете получить информацию о членах архивного файла, такую как дата последнего изменения файла, его сжатый размер и полное имя файла. доступ.file_size
Исходный размер файла будет получен в байтах.
В следующем примере показано, как получить более подробную информацию об архивном файле в Python REPL. Предполагая импортzipfile
модуль,bar_info
Тот же объект, что и в предыдущем примере:
>>> bar_info.date_time
(2018, 10, 7, 23, 30, 10)
>>> bar_info.compress_size
2856
>>> bar_info.filename
'sub_dir/bar.py'
bar_info
содержит околоbar.py
детали, такие как сжатый размер и полный путь к нему.
Первая строка показывает, как получить дату последнего изменения файла. В следующей строке показано, как получить размер файла после архивации. Последняя строка показывает, что файл архиваbar.py
полный путь.
ZipFile
Поддерживается протокол диспетчера контекста, поэтому его можно использовать с оператором with. Он автоматически закроется после завершения операцииZipFile
объект. попробуй из закрытыхZipFile
Открытие или извлечение файлов в объекте приведет к ошибке.
Извлечь ZIP-файл
zipfile
модули позволяют пройти.extract()
и.extractall()
Извлеките один или несколько файлов из ZIP-файла.
По умолчанию эти методы извлекают файлы в текущий каталог. Оба они принимают необязательный параметр пути, который позволяет указать другой указанный каталог для извлечения файлов. Если каталог не существует, он будет создан автоматически. Чтобы извлечь файлы из сжатого файла:
>>> import zipfile
>>> import os
>>> os.listdir('.')
['data.zip']
>>> data_zip = zipfile.ZipFile('data.zip', 'r')
>>> # 提取单个文件到当前目录
>>> data_zip.extract('file1.py')
'/home/test/dir1/zip_extract/file1.py'
>>> os.listdir('.')
['file1.py', 'data.zip']
>>> # 提所有文件到指定目录
>>> data_zip.extractall(path='extract_dir/')
>>> os.listdir('.')
['file1.py', 'extract_dir', 'data.zip']
>>> os.listdir('extract_dir')
['file1.py', 'file3.py', 'file2.py', 'sub_dir']
>>> data_zip.close()
Третья строка кодаos.listdir()
, который показывает, что в текущем каталоге есть только один файлdata.zip
.
Далее открываем в режиме чтенияdata.zip
и позвони.extract()
извлечь изfile1.py
..extract()
Возвращает полный путь извлеченного файла. Поскольку путь не указан,.extract()
будетfile1.py
Извлечь в текущий каталог.
В следующей строке выводится список каталогов, показывающий, что текущий каталог теперь включает архивные файлы в дополнение к исходным архивным файлам. Затем показано, как извлечь весь архив в указанный каталог..extractall()
Создайтеextract_dir
и воляdata.zip
содержимое извлекается в него. Последняя строка закрывает ZIP-архив.
Извлечение данных из зашифрованных документов
zipfile
Поддержка извлечения ZIP-файлов, защищенных паролем. Чтобы извлечь ZIP-файл, защищенный паролем, передайте пароль в качестве параметра.extract()
или.extractall()
метод:
>>> import zipfile
>>> with zipfile.ZipFile('secret.zip', 'r') as pwd_zip:
... # 从加密的文档提取数据
... pwd_zip.extractall(path='extract_dir', pwd='Quish3@o')
откроется в режиме чтенияsecret.zip
Архив. пароль, предоставленный.extractall()
, а содержимое сжатого файла извлекается вextract_dir
. Благодаря оператору with файл архива автоматически закрывается после завершения извлечения.
Создать новый файл архива
Чтобы создать новый ZIP-архив, откройте его в режиме записи (w).ZipFile
object и добавьте файлы в архив:
>>> import zipfile
>>> file_list = ['file1.py', 'sub_dir/', 'sub_dir/bar.py', 'sub_dir/foo.py']
>>> with zipfile.ZipFile('new.zip', 'w') as new_zip:
... for name in file_list:
... new_zip.write(name)
В этом примереnew_zip
открыть в режиме записи,file_list
Каждый файл добавляется в файл архива. После завершения оператора with он будет закрытnew_zip
. При открытии ZIP-файла в режиме записи содержимое сжатого файла удаляется и создается новый архив.
Чтобы добавить файлы в существующий архив, откройте его в режиме добавленияZipFile
объект, затем добавьте файл:
>>> with zipfile.ZipFile('new.zip', 'a') as new_zip:
... new_zip.write('data.txt')
... new_zip.write('latin.txt')
Это открывает тот, который был создан в режиме добавления в предыдущем примере.new.zip
Архив. открыть в режиме добавленияZipFile
Object позволяет добавлять новые файлы в ZIP-файл, не удаляя его текущее содержимое. После добавления файла в ZIP-файл оператор with вырывается из контекста и закрывает ZIP-файл.
Открыть файл архива TAR
Файлы TAR представляют собой несжатые файловые архивы, такие как ZIP. они могут использоватьgzip
,bzip2
иlzma
Метод сжатия для сжатия.TarFile
Класс позволяет читать и записывать архивы TAR.
Из архива читаем следующее:
import tarfile
with tarfile.open('example.tar', 'r') as tar_file:
print(tar_file.getnames())
tarfile
Объекты открываются, как и большинство файловых объектов. у них естьopen()
функция, принимающая шаблон для определения способа открытия файла.
Используйте режим «r», «w» или «a», чтобы открывать несжатые файлы TAR для чтения, записи и добавления соответственно. Чтобы открыть сжатый файл TAR, передайте параметр режима вtarfile.open()
, формат которогоfilemode [:compression]
. В следующей таблице перечислены возможные режимы, в которых можно открывать файлы TAR:
модель | поведение |
---|---|
r | Открыть архив в несжатом режиме чтения |
r:gz | Откройте архив в режиме чтения, сжатого gzip. |
r:bz2 | Открыть архив в сжатом режиме чтения bzip2 |
w | Открыть архив в несжатом режиме записи |
w:gz | Откройте архив в режиме записи, сжатом gzip. |
w:xz | Открыть архив в режиме записи со сжатием lzma |
a | Открыть архив в несжатом режиме добавления |
.open()
По умолчанию используется режим 'r'. Чтобы прочитать несжатый файл TAR и получить в нем имя файла, используйте.getnames()
:
>>> import tarfile
>>> tar = tarfile.open('example.tar', mode='r')
>>> tar.getnames()
['CONTRIBUTING.rst', 'README.md', 'app.py']
Это возвращает имена содержимого архива в виде списка.
Примечание. Чтобы показать вам, как использовать различные методы объекта tarfile, файлы TAR в примерах открываются и закрываются вручную в интерактивном сеансе REPL.
Взаимодействуя с файлом TAR таким образом, вы можете просматривать вывод выполнения каждой команды. Часто вам может потребоваться использовать диспетчер контекста для открытия файловоподобных объектов.
Кроме того, к метаданным каждой записи в архиве можно получить доступ с помощью специальных свойств:
>>> for entry in tar.getmembers():
... print(entry.name)
... print(' Modified:', time.ctime(entry.mtime))
... print(' Size :', entry.size, 'bytes')
... print()
CONTRIBUTING.rst
Modified: Sat Nov 1 09:09:51 2018
Size : 402 bytes
README.md
Modified: Sat Nov 3 07:29:40 2018
Size : 5426 bytes
app.py
Modified: Sat Nov 3 07:29:13 2018
Size : 6218 bytes
В этом примере выполните цикл.getmembers()
Возвращает список файлов и выводит свойства каждого файла..getmembers()
Возвращаемый объект имеет свойства, к которым можно получить программный доступ, например имя, размер и время последнего изменения каждого файла в архиве. После чтения или записи архива его необходимо закрыть для освобождения системных ресурсов.
Извлечь файлы из архива TAR
В этом разделе вы узнаете, как извлечь файлы из архива TAR, используя:
.extract()
.extractfile()
.extractall()
Чтобы извлечь один файл из архива TAR, используйтеextract()
, передавая имя файла:
>>> tar.extract('README.md')
>>> os.listdir('.')
['README.md', 'example.tar']
README.md
Файлы извлекаются из архива в файловую систему. перечислитьos.listdir()
подтверждатьREADME.md
Файл успешно извлечен в текущий каталог. Чтобы разархивировать или извлечь все из архива, используйте.extractall()
:
>>> tar.extractall(path="extracted/")
.extractall()
имеет необязательныйpath
параметр, чтобы указать, куда распаковать файл. Здесь архив распаковывается вextracted
в каталоге. Следующая команда показывает, что архив был успешно извлечен:
$ ls
example.tar extracted README.md
$ tree
.
├── example.tar
├── extracted
| ├── app.py
| ├── CONTRIBUTING.rst
| └── README.md
└── README.md
1 directory, 5 files
$ ls extracted/
app.py CONTRIBUTING.rst README.md
Чтобы извлечь файловый объект для чтения или записи, используйте.extractfile()
, который получает имя файла илиTarInfo
объект в качестве параметра..extractfile()
Возвращает файловый объект, который можно прочитать и использовать:
>>> f = tar.extractfile('app.py')
>>> f.read()
>>> tar.close()
Открытые архивы всегда должны быть закрыты после чтения или записи. Чтобы закрыть архив, вызовите дескриптор файла архива..close()
или при созданииtarfile
объекта, используя оператор with для автоматического закрытия архива по завершении. Это освободит системные ресурсы и запишет любые изменения, которые вы вносите в архив, в файловую систему.
Создайте новый TAR-архив
Чтобы создать новый архив TAR, вы можете сделать это:
>>> import tarfile
>>> file_list = ['app.py', 'config.py', 'CONTRIBUTORS.md', 'tests.py']
>>> with tarfile.open('packages.tar', mode='w') as tar:
... for file in file_list:
... tar.add(file)
>>> # Read the contents of the newly created archive
>>> with tarfile.open('package.tar', mode='r') as t:
... for member in t.getmembers():
... print(member.name)
app.py
config.py
CONTRIBUTORS.md
tests.py
Во-первых, вы создадите список файлов, чтобы добавить в архив, поэтому вам не нужно вручную добавлять каждый файл.
В следующей строке используется диспетчер with rayfile, чтобы открыть файл с именем в режиме записи.packages.tar
новый архив. Открытие архива в режиме записи ('w') позволяет вам записывать в архив новые файлы. Все существующие файлы в архиве будут удалены, и будет создан новый архив.
После создания и заполнения архива контекстный менеджер with автоматически закрывает его и сохраняет в файловой системе. Последние три строки открывают только что созданный архив и выводят имена содержащихся в нем файлов.
Чтобы добавить новые файлы в существующий архив, откройте архив в режиме добавления ('a'):
>>> with tarfile.open('package.tar', mode='a') as tar:
... tar.add('foo.bar')
>>> with tarfile.open('package.tar', mode='r') as tar:
... for member in tar.getmembers():
... print(member.name)
app.py
config.py
CONTRIBUTORS.md
tests.py
foo.bar
Открытие архива в режиме добавления позволяет добавлять в него новые файлы, не удаляя уже существующие в нем файлы.
Используйте сжатые архивы
tarfile
Можно читать и писать с помощьюgzip
,bzip2
иlzma
Сжатые архивные файлы TAR. Для чтения или записи сжатых архивов используйтеtarfile.open()
, передавая соответствующий режим для типа сжатия.
Например, для чтения или записи используйтеgzip
Сжатые данные архива TAR, пожалуйста, используйте отдельно'r:gz'
или'w:gz'
модель:
>>> files = ['app.py', 'config.py', 'tests.py']
>>> with tarfile.open('packages.tar.gz', mode='w:gz') as tar:
... tar.add('app.py')
... tar.add('config.py')
... tar.add('tests.py')
>>> with tarfile.open('packages.tar.gz', mode='r:gz') as t:
... for member in t.getmembers():
... print(member.name)
app.py
config.py
tests.py
'w:gz'
Открыть в режиме записиgzip
сжатый архив,'r:gz'
открыть в режиме чтенияgzip
Сжатый архив. Невозможно открыть сжатый архив в режиме добавления. Чтобы добавить файлы в сжатый архив, необходимо создать новый архив.
Более простой способ создания архивов
Стандартная библиотека Python также поддерживает использованиеshutil
Расширенные методы в модуле создают архивы TAR и ZIP.shutil
Утилита архивирования в ZIP позволяет создавать, читать и извлекать архивы ZIP и TAR. Эти утилиты зависят от нижнего уровняtarfile
иzipfile
модуль.
использоватьshutil.make_archive()Создать архив
shutil.make_archive()
Принимает как минимум два параметра: имя архива и формат архива.
По умолчанию он сжимает все файлы в текущем каталоге вformat
Формат архива, указанный в параметре. Вы можете пройти по желаниюroot_dir
параметр для сжатия файлов в разных каталогах..make_archive()
служба поддержкиzip
,tar
,bztar
иgztar
Формат архива.
Используется следующееshutil
Как создать архив TAR:
import shutil
# shutil.make_archive(base_name, format, root_dir)
shutil.make_archive('data/backup', 'tar', 'data/')
это скопируетdata /
и создайте файловую систему с именемbackup.tar
архив и возвращает его имя. Чтобы распаковать архив, позвоните.unpack_archive()
:
shutil.unpack_archive('backup.tar', 'extract_dir/')
перечислить.unpack_archive()
и передавая имя архива и целевой каталог,backup.tar
содержимое извлечено вextract_dir/
середина. Таким же образом можно создавать и распаковывать ZIP-архивы.
читать несколько файлов
Поддержка Python черезfileinput
Модули считывают данные из нескольких входных потоков или списков файлов. Этот модуль позволяет быстро и легко просмотреть содержимое одного или нескольких текстовых файлов. Используется следующееfileinput
Типичный метод:
import fileinput
for line in fileinput.input()
process(line)
fileinput
По умолчанию от прохожденияsys.argv
аргументы командной строки для получения ввода.
использоватьfileinputперебирать несколько файлов
давайте использоватьfileinput
Создайте общий инструмент UNIXcat
оригинальная версия.cat
Инструмент читает файлы последовательно, записывая их в стандартный вывод. Когда в аргументах командной строки указано несколько файлов,cat
объединит текстовый файл и отобразит результат в терминале:
# File: fileinput-example.py
import fileinput
import sys
files = fileinput.input()
for line in files:
if fileinput.isfirstline():
print(f'\n--- Reading {fileinput.filename()} ---')
print(' -> ' + line, end='')
print()
С двумя текстовыми файлами в текущем каталоге запуск этой команды приводит к следующему выводу:
$ python3 fileinput-example.py bacon.txt cupcake.txt
--- Reading bacon.txt ---
-> Spicy jalapeno bacon ipsum dolor amet in in aute est qui enim aliquip,
-> irure cillum drumstick elit.
-> Doner jowl shank ea exercitation landjaeger incididunt ut porchetta.
-> Tenderloin bacon aliquip cupidatat chicken chuck quis anim et swine.
-> Tri-tip doner kevin cillum ham veniam cow hamburger.
-> Turkey pork loin cupidatat filet mignon capicola brisket cupim ad in.
-> Ball tip dolor do magna laboris nisi pancetta nostrud doner.
--- Reading cupcake.txt ---
-> Cupcake ipsum dolor sit amet candy I love cheesecake fruitcake.
-> Topping muffin cotton candy.
-> Gummies macaroon jujubes jelly beans marzipan.
fileinput
Позволяет получить дополнительную информацию о каждой строке, например, является ли она первой строкой (.isfirstline()), номером строки (.lineno()) и именем файла (.filename()). ты сможешьздесьУзнайте больше об этом.
Суммировать
Теперь вы знаете, как выполнять наиболее распространенные операции с файлами и группами файлов с помощью Python. Вы узнали об использовании различных встроенных модулей для чтения, поиска и управления файлами.
Теперь вы можете сделать это в Python:
- Получить содержимое каталога и атрибуты файла
- Создание каталогов и деревьев каталогов
- Сопоставление имен файлов с использованием шаблонов сопоставления
- Создание временных файлов и каталогов
- Перемещайте, переименовывайте, копируйте и удаляйте файлы или каталоги
- Чтение и извлечение данных из различных типов архивных файлов
- использоватьfileinputЧитать несколько файлов одновременно
Подпишитесь на официальный аккаунт , чтобы узнать больше зарубежных высококачественных технических статей.