Используя модуль Python os, управлять и получать доступ к папкам, файлам и путям просто и удобно.
1. Введение
В недавних разработках часто требуются такие операции, как чтение, просмотр и изменение файлов.Чтобы выполнить эти операции быстро и легко, я предпочитаю использовать python. Со стандартным встроенным модулем ОС Python вы можете делать то, что хотите, всего несколькими строками кода. После использования os в этой статье приведены общие операции модуля os, которые в основном разделены на следующие разделы:
- Операции с папками: то есть создание папки, модификация (переименование/перемещение), запрос (просмотр, обход), удаление и т. д.
- Файловые операции: то есть создание файла, модификация, чтение, удаление и т. д.
- (папка/файл) операция пути: то есть операция пути папки или файла, такая как абсолютный путь, разделение имени файла и пути, разделение расширения и т. д.
Эта статья посвящена использованию и отображению часто используемых функций ОС, в основном с использованием интерактивного режима Python для описания кода. Последующие операции ввели модуль os по умолчанию, как показано ниже:
import os
2 операции с папками
местныйE://pythontest
Каталог используется в качестве демонстрационного каталога Текущие файлы в этом каталоге следующие:
test
│ test.txt
└─test-1
test-1.txt
test
а такжеtest-1
это папка,test.txt
а такжеtest-1.txt
это файл.
2.1 Операция запроса
Студенты, знакомые с Linux, должны быть правыls
/ pwd
/ cd
Другие операции не являются чем-то необычным, и соответствующий python также имеет соответствующие методы, в основном в том числе:
- listdir: список файлов и каталогов
- getcwd : получить текущий каталог
- chdir : изменить каталог
- stat: основная информация о файлах и каталогах
- walk : рекурсивно перемещаться по каталогам
>>> os.chdir("E://pythontest") # 更改目录
>>> os.getcwd() # 获取当前目录
'E:\\pythontest'
>>> os.listdir("test") # 文件及目录列表,相对路径
['test-1', 'test.txt']
>>> os.listdir("E://pythontest/test") # 文件及目录列表,绝对路径
['test-1', 'test.txt']
>>> os.stat("test") # 获取目录信息
os.stat_result(st_mode=16895, st_ino=4503599627377599, st_dev=266147611, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1590833033, st_mtime=1590832647, st_ctime=1590832207)
>>> os.stat("test/test.txt") # 获取文件信息
os.stat_result(st_mode=33206, st_ino=2251799813692354, st_dev=266147611, st_nlink=1, st_uid=0, st_gid=0, st_size=4, st_atime=1590832653, st_mtime=1590832609, st_ctime=1590832598)
Функция stat возвращает основную информацию о файле или каталоге следующим образом:
- st_mode:защищенный режим inode
- st_ino:номер узла inode.
- st_dev:Устройство, на котором находится индексный дескриптор.
- st_nlink:Количество ссылок для inode.
- st_uid:ID пользователя владельца.
- st_gid:Идентификатор группы владельца.
- st_size:Обычный размер файла в байтах
- st_atime:Время последнего визита.
- st_mtime:Время последней модификации.
- st_ctime:Время создания.
В повседневном использовании мы обычно используем st_size, st_ctime и st_mtime, чтобы получить размер файла, время создания и время модификации. Кроме того, мы видим, что время вывода — это количество секунд, которое здесь упоминается, об обработке преобразования даты.
(1) Преобразование секунд в строку формата даты и времени
>>> import time # 引入time模块
>>> timestruct = time.localtime(1590803070) # 转换为时间结构体
>>> print(timestruct)
time.struct_time(tm_year=2020, tm_mon=5, tm_mday=30, tm_hour=9, tm_min=44, tm_sec=30, tm_wday=5, tm_yday=151, tm_isdst=0)
>>> time.strftime("%Y-%m-%d %H:%M:%S",timestruct) # 格式化时间
'2020-05-30 09:44:30'
(2) Форматировать строку даты и времени в секундах
>>> import datetime # 引入datetime模块
>>> timeobject = datetime.datetime.strptime("2020-05-23 10:00:00","%Y-%m-%d %H:%M:%S") #解析时间字符串为时间对象
>>> timeseconds=time.mktime(timeobject.timetuple()) # 获取时间秒数
>>> print(int(timeseconds)) # 转为int显示
1590199200
-
Операция обхода
Функция walk рекурсивно обходит каталог и возвращает root, dirs и файлы, которые соответствуют текущему пройденному каталогу, подкаталогам и файлам в этом каталоге соответственно.
>>> data = os.walk("test") # 遍历test目录
>>> for root,dirs,files in data: # 递归遍历及输出
... print("root:%s" % root)
... for dir in dirs:
... print(os.path.join(root,dir))
... for file in files:
... print(os.path.join(root,file))
...
root:test
test\test-1
test\test-2
test\test.txt
root:test\test-1
test\test-1\test-1.txt
root:test\test-2
test\test-2\test-2.txt
2.2 Создать операцию
-
mkdir : создать один каталог, если родительский каталог в пути к каталогу не существует, создание не удается
-
makedirs : создать несколько каталогов, если родительский каталог в пути к каталогу не существует, он будет создан автоматически.
>>> os.mkdir("test")
>>> os.mkdir("test1/test1-1") # 父目录不存在,报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'test1/test1-1'
>>> os.makedirs("test1/test1-1") # 父目录不存在,自动创建
>>> os.listdir("test1")
['test1-1']
2.3 Операция удаления
- rmdir : удалить один пустой каталог, будет сообщено об ошибке, если каталог не пуст
- removeirs : удалить рекурсивные многоуровневые пустые каталоги по пути, если каталог не пустой, будет сообщено об ошибке
>>> os.rmdir("test1") # 若目录不为空,报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [WinError 145] 目录不是空的。: 'test1'
>>> os.rmdir("test1/test1-1")
>>> os.removedirs("test1/test1-1") # 删除多级空目录
>>> os.listdir(".")
['test']
Из-за ограничения на удаление пустых каталогов чаще используетсяshutil
в модулеrmtree
функция удаления непустых каталогов и их файлов.
2.4 Изменить операцию
- переименовать : переименовать каталог или файл, вы можете изменить путь к файлу или каталогу (то есть операцию перемещения).Если целевой каталог файла не существует, будет сообщено об ошибке.
- переименовывает : переименовать каталог или файл, если целевой каталог файла не существует, он будет создан автоматически
>>> os.makedirs("test1/test1-1")
>>> os.rename("test1/test1-1","test1/test1-2") # test1-1 修改为test1-2
>>> os.listdir("test1")
['test1-2']
>>> os.rename("test1/test1-2","test2/test2-2") # 由于test2目录不存在,报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'test1/test1-2' -> 'test2/test2-2'
>>> os.renames("test1/test1-2","test2/test2-2") # renames可自动创建不存在的目录
>>> os.listdir("test2")
['test2-2']
Если файл целевого пути уже существует, обе функции os.rename() и os.renames() сообщат об ошибке: FileExistsError: [WinError 183] Файл не может быть создан, если он уже существует.
3 Файловые операции
3.1 Операция запроса
- открыть/прочитать/закрыть: файл прочитан
- stat : информация о файле, подробности см. в описании статистики в предыдущей папке.
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT) # 打开文件
>>> str_bytes = os.read(f,100) # 读100字节
>>> str = bytes.decode(str_bytes) # 字节转字符串
>>> print(str)
test write data
>>> os.close(f) # 关闭文件
Обратите внимание, что операции открытия/чтения/закрытия должны выполняться вместе. Операция открытия должна указывать режим. Вышеупомянутое предназначено для открытия файла в режиме чтения-записи. Если файл не существует, создайте файл. Детали каждого режима следующие:
flags-- Этот параметр может быть следующими опциями, разделенными символом "|":
- os.O_RDONLY:открыть только для чтения
- os.O_WRONLY:открыть только для записи
- os.O_RDWR :открыть для чтения и записи
- os.O_NONBLOCK:Открыть без блокировки
- os.O_APPEND:открыть как добавить
- os.O_CREAT:Создать и открыть новый файл
- os.O_TRUNC:Откройте файл и обрежьте его до нулевой длины (должны быть права на запись)
- os.O_EXCL:Если указанный файл существует, вернуть ошибку
- os.O_SHLOCK:Автоматически приобретать общие блокировки
- os.O_EXLOCK:Автоматически приобретать независимые блокировки
- os.O_DIRECT:Устранение или уменьшение эффектов кэширования
- os.O_FSYNC :синхронная запись
- os.O_NOFOLLOW:Не переходите по программным ссылкам
3.2 Создать операцию
Как упоминалось ранее, используйте open, укажите режим и создайте файл, если он не существует. Немного похоже на touch в операциях Linux.
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT) # 若文件不存在,则创建
>>> os.close(f)
3.3 Изменить операцию
- open/write/close : записать содержимое файла
- переименовать, переименовать: в соответствии с именем модификации и операциями перемещения, описанными выше.
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT) # 打开文件
>>> os.write(f,b"test write data") # 写入内容
15
>>> os.close(f) # 关闭文件
3.4 Удалить
- remove : удалить файлы, обратите внимание, что каталоги нельзя удалить (используйте rmdir/removedirs)
>>> os.remove("test/test-1") # 删除目录报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'test/test1'
>>> os.remove("test/test.txt") # 删除文件
>>> os.listdir("test")
['test-1']
4 операции пути
В процессе использования файлов или каталогов часто необходимо обрабатывать пути к файлам и каталогам, поэтому в os есть подмодуль path, который специально используется для обработки операций с путями. Основные операции следующие:
- abspath : возвращает абсолютный путь
>>> os.path.abspath("test")
'E:\\pythontest\\test'
- exists : определяет, существует ли файл или каталог
>>> os.path.exists("test")
True
>>> os.path.exists("test/test.txt")
False
>>> os.path.exists("test/test-1/test-1.txt")
True
- isfile/isdir : определить, является ли это файлом/каталогом
>>> os.path.isdir("test")
True
>>> os.path.isfile("test/test-1/test-1.txt")
True
- basename/dirname: Получить конец пути и начало пути. На самом деле он последний на пути
/
— это разделитель, который делится на две части: head (голова) и tail (хвост), tail — это содержимое, возвращаемое basename, а head — содержимое, возвращаемое dirname. Часто используется для получения имен файлов, имен каталогов и т. д.
>>> os.path.basename("test/test-1/test-1.txt") # 文件名
'test-1.txt'
>>> os.path.basename("test/test-1/") # 空内容
''
>>> os.path.basename("test/test-1") # 目录名
'test-1'
>>> os.path.dirname("test/test-1/test-1.txt") # 文件所在目录路径
'test/test-1'
>>> os.path.dirname("test/test-1/") # 目录路径
'test/test-1'
>>> os.path.dirname("test/test-1") # 父目录路径
'test'
- join : Синтезируйте путь, то есть соедините два параметра, используя системный разделитель пути, чтобы сформировать полный путь.
>>> os.path.join("test","test-1") # 连接两个目录
'test\\test-1'
>>> os.path.join("test\\test-1","test-1.txt") # 连接目录与文件名
'test\\test-1\\test-1.txt'
- split : Разделите имя файла и папку, то есть возьмите последнюю косую черту «/» в качестве разделителя, разбейте путь на head и tail и верните его в виде кортежа (head, tail).
>>> os.path.split("test/test-1") # 分割目录
('test', 'test-1')
>>> os.path.split("test/test-1/") # 以/结尾的目录分割
('test/test-1', '')
>>> os.path.split("test/test-1/test-1.txt") # 分割文件
('test/test-1', 'test-1.txt')
- splitext: разделите имя пути и расширение файла, разделите путь с последним разделителем расширения ".", разделите его на начало и конец и верните его в виде кортежа (голова, хвост). Обратите внимание, что разница с разделением заключается в разделителе.
>>> os.path.splitext("test/test-1")
('test/test-1', '')
>>> os.path.splitext("test/test-1/")
('test/test-1/', '')
>>> os.path.splitext("test/test-1/test-1.txt") # 区分文件名及扩展名
('test/test-1/test-1', '.txt')
>>> os.path.splitext("test/test-1/test-1.txt.tmp") # 以最后的"."为分割点
('test/test-1/test-1.txt', '.tmp')
5 Примеры приложений
Ниже приводится комплексное использование предыдущих операционных функций в некоторых обычно используемых сценариях.
5.1 Пакетное изменение имени файла
def batch_rename(dir_path):
itemlist = os.listdir(dir_path)
# 获取目录文件列表
for item in itemlist:
# 连接成完整路径
item_path = os.path.join(dir_path, item)
print(item_path)
# 修改文件名
if os.path.isfile(item_path):
splitext = os.path.splitext(item_path)
os.rename(item_path, splitext[0] + "-副本" + splitext[1])
5.2 Пройтись по всем файлам с указанным расширением в каталоге и подкаталогах
def walk_ext_file(dir_path,ext):
# 遍历
for root, dirs, files in os.walk(dir_path):
# 获取文件名称及路径
for file in files:
file_path = os.path.join(root, file)
file_item = os.path.splitext(file_path)
# 输出指定扩展名的文件路径
if ext == file_item[1]:
print(file_path)
5.3 Сортировка файлов в указанном каталоге по времени модификации
def sort_file(dir_path):
# 排序前
itemlist = os.listdir(dir_path)
print(itemlist)
# 正向排序
itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename)))
print(itemlist)
# 反向排序
itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename)), reverse=True)
print(itemlist)
# 获取最新修改的文件
print(itemlist[0])
6 Резюме
Когда вам нужно работать с файлами или каталогами, python — это простой и быстрый выбор. В этой статье представлены общие методы стандартного встроенного модуля os и подмодуля os.path Python, и, наконец, объединены сценарии использования для всестороннего использования. Я считаю, что большинство ваших потребностей в операциях с файлами и каталогами были удовлетворены.
использованная литература
-
os-модуль python:
https://www.cnblogs.com/yufeihlf/p/6179547.html
-
Методы файла/каталога ОС Python:
https://www.runoob.com/python/os-file-methods.html
-
Модуль Python os.path():
https://www.runoob.com/python/python-os-path.html
Прошлые статьи
- Распределенное развертывание MinIO
- Используйте MinIO для простого создания сервисов статических ресурсов
- Получить несколько источников данных SpringBoot (3): параметризованный источник изменений
- Получить несколько источников данных SpringBoot (2): источники динамических данных
- Получить несколько источников данных SpringBoot (1): стратегии с несколькими источниками
- Знания, необходимые для разработки Java: динамический прокси
- Лучшие книги для чтения в 2019 году
Мой официальный аккаунт (поискMason技术记录
) для более технических записей: