Файловая операция Python, достаточно прочитать это

Python

Эта статья является переводом, ссылка на оригинал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()В каждом цикле возвращаются три значения:

  1. имя текущей папки
  2. Список подпапок в текущей папке
  3. Список файлов в текущей папке

На каждой итерации он печатает имена найденных подкаталогов и файлов:

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

создай здесьZipFileObject, передайте имя 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).ZipFileobject и добавьте файлы в архив:

>>> 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Архив. открыть в режиме добавленияZipFileObject позволяет добавлять новые файлы в 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Читать несколько файлов одновременно

qrcode_for_gh_aeefa52af384_258.jpg

Подпишитесь на официальный аккаунт , чтобы узнать больше зарубежных высококачественных технических статей.