«Вы все еще вручную манипулируете «файлами» или «папками»?» | Месяц тем Python

задняя часть Python анализ данных
«Вы все еще вручную манипулируете «файлами» или «папками»?» | Месяц тем Python

Эта статья участвует в "Месяце тем Python". Подробнее см.:Сезон создания Python, покажите свои статьи о Python — призы в размере 2000 юаней ждут вас, чтобы выиграть

Вечный ученик, практик и активный собеседник, приверженный пути развития технологий, оригинальный блогер, занятый и иногда ленивый, и подросток, которому иногда скучно, а иногда и смешно.

Добро пожаловать в поиск WeChat »ИТ-путешествие Джейка"обрати внимание на!

Оригинальная ссылка:«Вы все еще работаете с «файлами» или «папками» вручную?»

1. Все файлы и папки в выходном каталоге

1.1 os.getcwd(): получить рабочий путь текущей программы Python

import os
os.getcwd()

Результат выглядит следующим образом:

图片

1.2 Описание косой черты (/) и обратной косой черты () в путях

图片

1.3 os.path.join(): автоматический путь подключения (разные операционные системы, разные коннекторы)

os.path.join("My Project","Demo")
"C:\\" + os.path.join("My Project","Demo")

Результат выглядит следующим образом:

图片

1.4 Абсолютные и относительные пути

图片

1.5 os.listdir() и os.isdir()

os.listdir(): список всех файлов и папок в текущей папке программы;
os.scandir(): лучшая альтернатива os.listdir(), возвращающая итератор. Примечание. Мы можем использовать цикл для перебора каждого элемента в нем, os.scandir() имеет два специальных свойства и метод, которые мы демонстрируем в следующем примере.

os.listdir()
os.scandir()
for item in os.scandir():
    print(item.name,item.is_dir(),"\n\t",item.path)

Результат выглядит следующим образом:

图片

На самом деле, os.listdir() или os.scandir() могут передать путь, а затем получить файлы или папки по указанному пути.

os.listdir("G:\\6Tipdm\\Python集训营_情感分析")
for item in os.scandir("G:\\6Tipdm\\Python集训营_情感分析"):
    print(item.name,item.is_dir(),"\n")

Результат выглядит следующим образом:

图片

2. Обход, поиск файлов и запрос информации о файле

2.1 Найдите «файл» или «папку» в папке внутри папки

2.1.1 os.walk (путь): введите путь, чтобы помочь нам найти все файлы в папке в папке в папке.
for dirpath, dirnames, files in os.walk("./"):
    print(f"发现文件夹\t{dirpath}")
    print(files)
-----------------------------------------------
 for dirpath, dirnames, files in os.walk("./"):
    print(f"发现文件夹\t{dirpath}")
    print(dirnames) 
"""
dirpath是文件夹路径
dirnames是dirpath这个文件夹下的子文件夹列表
files是dirpath这个文件夹里的文件列表
"""

Результат выглядит следующим образом:

图片

2.2 Поиск, сопоставление имени файла и просмотр информации о файле

2.2.1 Метод 1: начинаетс() и заканчивается()
  • String A.startswith(string B): начинается ли строка A со строки B;
  • String A.endswith(string B): заканчивается ли строка A строкой B;
"abc.txt".startswith("abc")
"abc.txt".endswith(".txt")
------------------------------------------------------
list1 = ["a.txt", "b.py", "c.xlsx", "d.txt", "e.txt"]
for item in list1:
    if  item.endswith(".txt"):
        print(item)

Результат выглядит следующим образом:

图片

2.2.2 Метод 2: модуль глобуса

Этот модуль может выполнять сопоставление файлов аналогично «обычному», что очень удобно в использовании.

图片

код показывает, как показано ниже:

for i in glob.glob("*.txt"):
    print(i)
---------------------------
for i in glob.glob("a*.txt"):
    print(i)
---------------------------
for i in glob.glob("a?.txt"):
    print(i)
---------------------------
for i in glob.glob("a??.txt"):
    print(i)

Результат выглядит следующим образом:

图片

Специально: в методе glob() также есть параметр recursive = True, который может найти для вас квалифицированные файлы во всех глубоких папках.

# 注意:一个*和两个*的区别
glob.glob("*/*.txt",recursive=True)
glob.glob("**/*.txt",recursive=True)

Результат выглядит следующим образом:

图片

2.2.3 Файлы, возвращаемые os.scandir(), можно просмотреть с помощью метода stat().

图片

код показывает, как показано ниже:

for file in os.scandir():
    print(file.name, file.stat(), "\n")

Результат выглядит следующим образом:

图片

Далее, давайте взглянем на упомянутые выше общие свойства.

import time 

for file in os.scandir():
    print(file.name, file.stat().st_size, time.ctime(file.stat().st_ctime), "\n")

Результат выглядит следующим образом:

图片

3. Создавайте, копируйте, перемещайте, удаляйте, переименовывайте файлы и папки в пакетном режиме.

3.1 Создайте папку

os.mkdir("新文件夹名称"):创建单层文件夹;
os.makedirs("第一层/第二层/第三层"):创建多层文件夹;
list1 = ["文件夹{}".format(i) for i in range(5)]
for i in list1:
    os.mkdir(i)

Результат выглядит следующим образом:

图片

Проблема: если папка уже существует, запуск этого кода сообщит об ошибке. На этом этапе вы можете добавить условие суждения

(os.path.exists("新文件夹名称"))。
if not os.path.exists("傻逼"):
    os.mkdir("傻逼")

Результат выглядит следующим образом:

图片

3.2 Копирование файлов и папок (модуль Shutil)

  • Shutil.copy("Файл для копирования", "Место для копирования"): Скопируйте файл;
  • Shutil.copytree("Папка для копирования", "Расположение новой папки для копирования"): скопировать папку;
3.2.1 Копировать файлы
  • Shutil.copy("Файл для копирования", "Местоположение для копирования");

Операция выглядит следующим образом:

import shutil
# 将aba.txt复制一份到project文件夹中。
shutil.copy("aba.txt", "./project")
# 将aba.txt复制一份到project文件夹中,并重新命名为“新名字.txt”。
shutil.copy("aba.txt", "./project/新名字.txt")

Результат выглядит следующим образом:

图片

3.2.2 Копирование папки: эквивалентно переименованию папки
  • Shutil.copytree("Папка для копирования", "Расположение новой папки для копирования");
  • Примечание. Переместите папку в другую папку (папка должна быть новой), а не в существующую;

Операция выглядит следующим образом:

import shutil
shutil.copytree("project", "./qq")

Результат выглядит следующим образом:

图片

3.3 Перемещение файлов или папок

  • Shutil.move("файл или папка для перемещения","местоположение для перемещения"): переместить файл/папку;
  • После перемещения папки или файла исходный файл исчезает;
3.3.1 Перемещение файлов
  • Shutil.move("файл для перемещения", "позиция для перемещения")

Операция выглядит следующим образом:

import shutil
# 将aba.txt移动到“傻逼”文件夹下
shutil.move("aba.txt","./傻逼/")
# # 将test.txt移动到“傻逼”文件夹下,并重新命名为test1.txt
shutil.move("test.txt","./傻逼/test1.txt")

Результат выглядит следующим образом:

图片

3.3.2 Перемещение папки
  • Shutil.move("Папка для перемещения","Место для перемещения")

Операция выглядит следующим образом:

import shutil
# 将“第一层”文件夹移动到“傻逼”文件夹下
shutil.move("第一层","./傻逼/")
# 将“qq”文件夹移动到“傻逼”文件夹下,并重新命名为“哈哈”文件夹
shutil.move("qq","./傻逼/哈哈")

Результат выглядит следующим образом:

图片

4. Переименуйте файл или папку

  • os.rename("файл/папка", "новое имя файла/новое имя папки")

Операция выглядит следующим образом:

import os
# 将test1.xlsx重命名为“my.xlsx”
os.rename("test1.xlsx","my.xlsx")
# 将“傻逼”文件夹重命名为“傻子”文件夹
os.rename("傻逼","傻子")

Результат выглядит следующим образом:

图片

5. Удалить файлы или папки

5.1 Удаление файлов

  • os.remove("Файл для удаления")
  • Примечание. Это относится только к удалению файлов, а не папок;

Операция выглядит следующим образом:

import os 
# 删除“my.xlsx”文件
os.remove("my.xlsx")

Результат выглядит следующим образом:

图片

5.2 Удалить папку

  • Shutil.rmtree("Папка для удаления")

Операция выглядит следующим образом:

import shutil
# 删除“文件夹0”这个文件夹
shutil.rmtree("文件夹0")

Результат выглядит следующим образом:

图片

6. Создавайте и распаковывайте архивы

  • Примечание. Упомянутый здесь сжатый пакет относится к сжатому пакету в формате «.zip»;

6.1 Прочитайте файлы в сжатом пакете

import zipfile

with zipfile.ZipFile("python办公自动化.zip", "r") as zipobj:
    print(zipobj.namelist())
-----------------------------------------------------------
# 注意:有时候需要写成filename.encode("cp437").decode("gbk")
with zipfile.ZipFile("python办公自动化.zip", "r") as zipobj:
    for filename in zipobj.namelist():
        print(filename.encode("gbk").decode("gbk"))

Результат выглядит следующим образом:

图片

6.2 Прочитайте информацию о файле в сжатом пакете

import zipfile

with zipfile.ZipFile(r"G:\tableau书籍\Tableau文件.zip", "r") as zipobj:
    for filename in zipobj.namelist():
        info = zipobj.getinfo(filename)
        new_filename = filename.encode("cp437").decode("gbk")
        print(new_filename, info.file_size/1024/1024, info.compress_size/1024/1024)

Результат выглядит следующим образом:

图片

6.3 Разархивируйте сжатый пакет

  • извлечь("Имя файла для распаковки в сжатом пакете", "Куда его распаковать"): Распаковать один файл в сжатом пакете;
  • extractall("Куда извлечь"): Извлечь все файлы в сжатом пакете;
6.3.1 Извлечение одного файла
  • Extract("Имя файла для распаковки в сжатом пакете", "Куда его распаковать")
import zipfile
# 将该压缩包中的“a.txt”文件,单独解压到“傻子”文件夹下
with zipfile.ZipFile(r"G:\6Tipdm\7python办公自动化\python办公自动化.zip", "r") as zipobj:
    zipobj.extract("a.txt","./傻子/")

Результат выглядит следующим образом:

图片

6.3.2 Разархивируйте весь файл
  • extractall("Откуда извлечь")
import zipfile
# 将该压缩包整个解压到“文件夹1”文件夹下
with zipfile.ZipFile(r"G:\6Tipdm\7python办公自动化\python办公自动化.zip", "r") as zipobj:
    zipobj.extractall("./文件夹1/")

Результат выглядит следующим образом:

图片

Примечание. Если ваш сжатый пакет «имеет пароль», используйте следующие методы для его распаковки.

图片

6.4 Создать архив

6.4.1 Для некоторых файлов создайте сжатый пакет
file_list = ["a.txt", "aa.txt", "文件夹1"]
# 将上述三个文件,进行打包,使用“w”
with zipfile.ZipFile(r"我创建的压缩包.zip", "w") as zipobj:
    for file in file_list:
        zipobj.write(file)

Результат выглядит следующим образом:

图片

6.4.2 Сжатый пакет уже существует, добавьте в него файлы
# 往上述压缩包中,再次添加一个新文件“傻子”文件夹,使用“a”
with zipfile.ZipFile(r"我创建的压缩包.zip", "a") as zipobj:
    for file in file_list:
        zipobj.write("傻子")

Результат выглядит следующим образом:

图片

Рекомендуемое чтение

Наиболее подробный Python в сочетании с моделью RFM для практического применения стратификации пользователей!

Используйте Python для объединения нескольких листов, объединения нескольких книг и разделения листа по столбцам.


Оригинальность непростая.Если вы считаете, что эта статья полезна для вас, ставьте лайк, комментируйте или пересылайте эту статью, потому что это будет моей мотивацией выпускать больше качественных статей, спасибо!

Кстати, друзья-копатели, не забудьте дать мне бесплатный подписчик! На случай, если ты заблудишься и не сможешь найти меня в следующий раз.

Увидимся в следующий раз!