Python 3 — Как просканировать папку /tmp, найти в ней файлы, которые начинаются с «x» и удалить их? [закрыт]
Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.
Закрыт 2 года назад .
Я делаю программу для очистки кеша / мусора. Она будет удалять всё, что начинается с:
1) Папки ".com.google.Chrome." 2) Файлы "config-err" 3) Папка "mintUpdate" 4) Файлы-изображения "xapp-tmp-" 5) Папки "ssh-"
Давайте код только для Linux, у меня нет Windows.
Отслеживать
задан 7 янв 2022 в 12:49
Brainsluggy Brainsluggy
106 13 13 бронзовых знаков
и что вы уже сделали? что не получилось?
7 янв 2022 в 12:54
Я не знаю как сделать, как раз пытаюсь найти ответ. Но его нет
7 янв 2022 в 12:56
на что нет ответа — как получить список файлов в папке? гугл в помощь — миллион страниц. выбирайте и пробуйте
7 янв 2022 в 13:00
@splash58 ответа нет на то, почему за него это никто еще не сделал
7 янв 2022 в 13:18
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Во-первых ВСЕ нужные функции доступны для поиска в интернете.
import os tmp_path='/tmp' os.chdir(tmp_path) # Переходим в tmp all_dirs_and_files = os.listdir() # Получаем список файлов patterns = ['.com.goole.Chrome.', 'config-err', 'mintUpdate', 'xapp-tmp-', 'ssh-'] # Здесь список проверяемых паттернов for f_or_d in all_dirs_and_files: # Перебираем все папки и файлы flag = False for patt in patterns: if f_or_d.startswith(patt): # Проверяем на соответствие с каждым паттерном flag = True if flag: # Если подошло под паттерн if os.path.isfile(f_or_d): # Проверяем файл ли это os.remove(f_or_d) # Удаляем файл else: os.rmdir(f_or_dir) # Иначе удаляем папку
Прочти некоторые списки полезных функций:
UPDATE
Сразу не заметил что некоторые паттерны под папки, некоторые только под файлы.
Вот улучшенный код
import os tmp_path='/tmp' os.chdir(tmp_path) # Переходим в tmp all_dirs_and_files = os.listdir() # Получаем список файлов patts_d = ['.com.goole.Chrome.', 'mintUpdate', 'ssh-'] # Здесь список проверяемых паттернов для директорий patts_f = ['config-err', 'xapp-tmp-'] for f_or_d in all_dirs_and_files: # Перебираем все папки и файлы if os.path.isfile(f_or_d): # Проверяем файл ли это flag = False for patt in patts_f: if f_or_d.startswith(patt): # Проверяем на соответствие с каждым паттерном flag = True if flag: os.remove(f_or_d) else: flag = False for patt in patts_d: if f_or_d.startswith(patt): # Проверяем на соответствие с каждым паттерном flag = True if flag: os.rmdir(f_or_d)
Модуль tempfile в Python, временные файлы и каталоги
Создание защищенных временных файлов и каталогов для программы
Модуль tempfile создает временные файлы и каталоги. Работает на всех поддерживаемых платформах. Модуль определяет несколько конструкторов высокого уровня, которые обеспечивают автоматическую очистку и могут использоваться в качестве менеджеров контекста. Функции tempfile.mkstemp() и tempfile.mkdtemp() являются функциями более низкого уровня, которые требуют ручной очистки.
Приложения, которым требуются временные файлы для хранения данных, без необходимости делиться этим файлом с другими программами, должны использовать функцию tempfile.TemporaryFile() для создания файлов. Функция создает файл и на платформах, где это возможно, немедленно отменяет связь с ним. Это делает невозможным для другой программы найти или открыть файл, поскольку в таблице файловой системы нет ссылки на него.
Когда требуется несколько временных файлов, может быть удобнее создать один временный каталог с помощью tempfile.TemporaryDirectory() и открыть все файлы в этом каталоге.
Все вызываемые пользователем функции и конструкторы принимают дополнительные аргументы, которые позволяют напрямую контролировать расположение и имя временных файлов и каталогов. Имена файлов, используемые этим модулем, содержат строку случайных символов, которая позволяет безопасно создавать эти файлы в общих временных каталогах. Для обеспечения обратной совместимости порядок аргументов несколько странный. Для ясности рекомендуется использовать ключевые аргументы.
Примеры:
Вот несколько примеров типичного использования модуля tempfile :
>>> import tempfile # Создать временный файл и # записать в него некоторые данные >>> fp = tempfile.TemporaryFile() >>> fp.write(b'Hello world!') # Читать данные из файла >>> fp.seek(0) >>> fp.read() # b'Hello world!' # Закройте файл, он будет удален >>> fp.close()
Создать временный файл, используя менеджер контекста
>>> with tempfile.TemporaryFile() as fp: . fp.write(b'Hello world!') . fp.seek(0) . fp.read() # b'Hello world!' >>> # Файл закрыт и удален
Создать временный каталог с помощью диспетчера контекста
>>> with tempfile.TemporaryDirectory() as tmpdirname: . print('created temporary directory', tmpdirname) >>> # Каталог и содержимое были удалены
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Класс TemporaryFile() модуля tempfile
- Функция NamedTemporaryFile() модуля tempfile
- Функция SpooledTemporaryFile() модуля tempfile
- Функция TemporaryDirectory() модуля tempfile
- Функция mkstemp() модуля tempfile
- Функция mkdtemp() модуля tempfile
- Вспомогательные функции модуля tempfile
tempfile — Генерация временных файлов и каталогов¶
Модуль создает временные файлы и каталоги. Он работает на всех поддерживаемых платформах. TemporaryFile , NamedTemporaryFile , TemporaryDirectory и SpooledTemporaryFile — это высокоуровневые интерфейсы, которые обеспечивают автоматическую очистку и могут быть используемый в качестве менеджеров контекст. mkstemp() и mkdtemp() — это низкоуровневые функции, требующие ручной очистки.
Все вызываемые пользователем функции и конструкторы принимают дополнительные аргументы, позволяющие непосредственно управлять расположением и именем временных файлов и каталогов. Имена файлов, используемый этим модулем, содержат строка случайных символов, что позволяет безопасно создавать эти файлы в общих временных каталогах. Для поддержания обратной совместимости порядок аргументов несколько странен; для ясности рекомендуется использовать ключевой аргументы.
Модуль определяет следующие вызываемые пользователем элементы:
tempfile. TemporaryFile ( mode=’w+b’, buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None ) ¶
Возвращает файлоподобный объект , который можно используемый как временную область хранения. Файл создается безопасно, используя те же правила, что и mkstemp() . Он будет уничтожен, как только будет закрыт (включая неявное закрытие, когда объект собран мусором). В Unix запись каталога для файла либо не создается вообще, либо удаляется сразу после создания файла. Другие платформы не поддерживают это; код не следует полагаться на временный файл, созданный с помощью этой функции и имеющий или не имеющий видимое имя в файловой системе.
Результирующий объект можно используемый как диспетчер контекст (см. Примеры ). По завершении контекст или уничтожения объекта файла временный файл будет удален из файловой системы.
Параметр mode по умолчанию имеет значение ‘w+b’ , чтобы созданный файл можно было прочитать и записать без закрытия. Бинарный режим используемый так, чтобы вести себя последовательно на всех платформах без учета хранимых данных. buffering, encoding, errors и newline интерпретируются как open() .
Параметры dir, prefix и suffix имеют то же значение и значения по умолчанию, что и для mkstemp() .
Объект возвращенный является истинным файловым объектом на платформах POSIX. На других платформах это файлообразный объект, file атрибут которого является базовым истинным файловым объектом.
Флаг os.O_TMPFILE используемый, если он доступен и работает (для Linux требуется ядро Linux 3.11 или более поздней версии).
Raises an auditing event tempfile.mkstemp with argument fullpath .
Изменено в версии 3.5: Теперь используется флаг os.O_TMPFILE , если доступен.
Изменено в версии 3.8: Добавлен errors параметр.
tempfile. NamedTemporaryFile ( mode=’w+b’, buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None ) ¶
Функция работает точно так же, как TemporaryFile() , за исключением того, что файл гарантированно имеет видимое имя в файловой системе (в Unix запись каталога не является несвязанной). Это имя можно получить из name атрибут файлового объекта возвращенный. Может ли имя быть используемый для открытия файла во второй раз, в то время как именованный временный файл все еще открыт, варьируется между платформами (это может быть так используемый в Unix; в Windows NT или более поздней версии). Если delete имеет значение true (по умолчанию), файл удаляется сразу после закрытия. Объект возвращенный всегда является похожим на файл объектом, file атрибут которого является базовым объектом true file. Этот файлообразный объект можно используемый в with инструкция, как и обычный файл.
Raises an auditing event tempfile.mkstemp with argument fullpath .
Изменено в версии 3.8: Добавлен параметр errors.
tempfile. SpooledTemporaryFile ( max_size=0, mode=’w+b’, buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None ) ¶
Функция работает точно так же, как TemporaryFile() , за исключением того, что данные перегружаются в память до тех пор, пока размер файла не превысит max_size, или пока не будет вызван метод fileno() файла, в этот момент содержимое записывается на диск, и операция продолжается так же, как и TemporaryFile() .
Результирующий файл имеет один дополнительный метод, rollover() , который вызывает перемещение файла в файл на диске независимо от его размера.
Объект возвращенный — это файлообразный объект, _file атрибут которого является либо объектом io.BytesIO , либо объектом io.TextIOWrapper (в зависимости от того, был ли указан двоичный или текстовый mode), либо объектом true, в зависимости от того, был ли вызван rollover() . Этот файлообразный объект можно используемый в with инструкция, как и обычный файл.
Изменено в версии 3.3: метод усечения теперь принимает аргумент size .
Изменено в версии 3.8: Добавлен errors параметр.
tempfile. TemporaryDirectory ( suffix=None, prefix=None, dir=None ) ¶
Функция надежно создает временный каталог, используя те же правила, что и mkdtemp() . Полученный объект можно используемый в качестве менеджера контекст (см. Примеры ). По завершении контекст или уничтожения объекта временного каталога вновь созданный временный каталог и все его содержимое удаляются из файловой системы.
Имя каталога можно получить из name атрибут объекта возвращенный. Когда объект возвращенный будет используемый как менеджером контекст, name будет назначен на цель as клаузула в with инструкция, если будет тот.
Каталог можно явно очистить, вызвав метод cleanup() .
Raises an auditing event tempfile.mkdtemp with argument fullpath .
Добавлено в версии 3.2.
tempfile. mkstemp ( suffix=None, prefix=None, dir=None, text=False ) ¶
Создает временный файл максимально безопасным способом. В создании файла отсутствуют условия гонки, предполагающие, что платформа правильно реализует флаг os.O_EXCL для os.open() . Файл доступен для чтения и записи только при создании идентификатора пользователя. Если платформа использует биты разрешения, чтобы указать, является ли файл исполняемым, файл исполняется никем. Файловый дескриптор не наследуется дочерними процессами.
В отличие от TemporaryFile() , пользователь mkstemp() несет ответственность за удаление временного файла после его завершения.
Если suffix не None , имя файла будет заканчиваться этим суффиксом, в противном случае суффикс не будет. mkstemp() не помещает точку между именем файла и суффиксом; если он вам нужен, положите его в начале suffix.
Если prefix не None , имя файла будет начинаться с этого префикса; в противном случае префикс по умолчанию будет используемый. По умолчанию используется значение возвращает значение gettempprefix() или gettempprefixb() .
Если dir не None , файл будет создан в этой папке; в противном случае используемый каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, задавая переменные среды TMPDIR, TEMP или TMP. Таким образом, нет гарантии, что сгенерированное имя файла будет иметь какие-либо хорошие свойства, например, не требовать кавычек при передаче внешним командам через os.popen() .
Если какие-либо из suffix, prefix и dir не являются None , они должны быть одного типа. Если это байты, возвращенный имя будет байтами вместо строки. Если требуется принудительно ввести байты возвращает значение с другим поведением по умолчанию, передайте suffix=b» .
Если задано значение text и true, файл открывается в текстовом режиме. В противном случае (по умолчанию) файл открывается в двоичном режиме.
mkstemp() возвращает кортеж, содержащий дескриптор уровня ОС, в открытый файл (как будет возвращенный os.open() ) и абсолютное имя пути этого файла в таком порядке.
Raises an auditing event tempfile.mkstemp with argument fullpath .
Изменено в версии 3.5: suffix, prefix и dir теперь могут подаваться в байтах для получения байтов возвращает значение. До этого разрешалась только стр. suffix и prefix теперь принять и по умолчанию None , чтобы вызвать значение соответствующего используемый по умолчанию.
Изменено в версии 3.6: Теперь параметр dir принимает путеподобный объект .
tempfile. mkdtemp ( suffix=None, prefix=None, dir=None ) ¶
Создает временный каталог максимально безопасным способом. В созданном каталоге отсутствуют условия гонки. Каталог доступен для чтения, записи и поиска только при создании идентификатора пользователя.
Пользователь mkdtemp() несет ответственность за удаление временного каталога и его содержимого по завершении работы с ним.
Аргументы prefix, suffix и dir те же, что и для mkstemp() .
mkdtemp() возвращает абсолютное имя пути нового каталога.
Raises an auditing event tempfile.mkdtemp with argument fullpath .
Изменено в версии 3.5: suffix, prefix и dir теперь могут подаваться в байтах для получения байтов возвращает значение. До этого разрешалась только стр. suffix и prefix теперь принять и по умолчанию None , чтобы вызвать значение соответствующего используемый по умолчанию.
Изменено в версии 3.6: Теперь параметр dir принимает путеподобный объект .
tempfile. gettempdir ( ) ¶
Возвращает имя каталога, используемый для временных файлов. Это определяет значение по умолчанию для аргумента dir для всех функций в этом модуле.
Python ищет стандартный список каталогов для поиска каталога, в котором вызывающий пользователь может создавать файлы. Список:
- Каталог, именованный переменной среды TMPDIR .
- Каталог, именованный переменной среды TEMP .
- Каталог, именованный переменной среды TMP .
- Местоположение для конкретной платформы:
- В Windows каталоги C:\TEMP , C:\TMP , \TEMP и \TMP в таком порядке.
- На всех остальных платформах каталоги /tmp , /var/tmp и /usr/tmp в таком порядке.
- В крайнем случае, текущий рабочий каталог.
Результат этого поиска кэшируется, см. описание tempdir ниже.
То же самое, что и gettempdir() , но возвращает значение в байтах.
Добавлено в версии 3.5.
tempfile. gettempprefix ( ) ¶
Возвращает создания временных файлов используемый префикс имени файла. Он не содержит компонент каталога.
То же самое, что и gettempprefix() , но возвращает значение в байтах.
Добавлено в версии 3.5.
Модуль использует глобальную переменную для хранения имени каталога используемый для временных файлов, возвращенный gettempdir() . Он может быть установлен непосредственно для переопределения процесса выбора, но это не рекомендуется. Все функции в этом модуле имеют dir аргумент, который можно используемый для указания каталога, и это рекомендуемый подход.
Если задано значение значение, отличное от None , эта переменная определяет значение по умолчанию для аргумента dir к функциям, определенным в этом модуле.
Если tempdir является None (по умолчанию) при любом вызове любой из вышеперечисленных функций, за исключением того, gettempprefix() он инициализируется в соответствии с алгоритмом, описанным в gettempdir() .
Примеры¶
Ниже приведены некоторые примеры типичного использования модуля tempfile :
>>> import tempfile # создать временный файл и записать в него некоторые данные >>> fp = tempfile.TemporaryFile() >>> fp.write(b'Hello world!') # читать данные из файла >>> fp.seek(0) >>> fp.read() b'Hello world!' # закрыть файл, он будет удален >>> fp.close() # создать временный файл, используя менеджер контекста >>> with tempfile.TemporaryFile() as fp: . fp.write(b'Hello world!') . fp.seek(0) . fp.read() b'Hello world!' >>> # файл закрыт и удален # создать временный каталог с помощью менеджера контекста >>> with tempfile.TemporaryDirectory() as tmpdirname: . print('created temporary directory', tmpdirname) >>> # каталог и содержимое были удалены
Устаревшие функции и переменные¶
Историческим способом создания временных файлов было сначала создание имени файла с помощью функции mktemp() , а затем создание файла с использованием этого имени. К сожалению, это не безопасно, поскольку другой процесс может создать файл с таким именем в период между вызовом mktemp() и последующей попыткой создать файл первым процессом. Решение состоит в объединении этих двух шагов и немедленном создании файла. Этот подход используемый mkstemp() и другие функции, описанные выше.
Не рекомендуется, начиная с версии 2.3: Вместо этого используйте mkstemp() .
Возвращает абсолютное имя пути файла, который не существовал на момент выполнения вызова. Аргументы prefix, suffix и dir аналогичны аргументам mkstemp() , за исключением того, что имена файлов байтов, suffix=None и prefix=None не поддерживаются.
Использование этой функции может привести к появлению дырки в безопасности в программе. К тому времени, когда вы будете делать что-либо с именем файла, который он возвращает, кто-то другой, возможно, избил вас до удара. Использование mktemp() можно легко заменить на NamedTemporaryFile() , передав ему параметр delete=False :
>>> f = NamedTemporaryFile(delete=False) >>> f.name '/tmp/tmptjujjt' >>> f.write(b"Hello World!\n") 13 >>> f.close() >>> os.unlink(f.name) >>> os.path.exists(f.name) False
Временные файлы и директории
Временные файлы и директории нужны, если промежуточные данные слишком велики, чтобы держать их в оперативной памяти. Или бывают случаи, что программа или компонент обрабатывает только файлы и не может принимать данные по другим каналам.
Для создания временных файлов и директорий есть модуль tempfile. Удобно, что временные файлы создаются в специальном месте ФС и удаляются автоматически после закрытия. Нам можно не думать, куда положить временный файл, как его назвать и как почистить мусор после выполнения программы.
import tempfile with tempfile.NamedTemporaryFile() as fp: print(fp.name) # путь к файлу fp.write(b'Hello world!') fp.seek(0) print(fp.read())
fp – файло-подобный объект, вроде того, что идет из open . С ним работают также, как с обычным файлом. Он будет удален в момент закрытия.
Есть еще TemporaryFile . Отличие NamedTemporaryFile от TemporaryFile в том, что NamedTemporaryFile будет гарантированно виден в файловой системе и иметь атрибут name , тогда как второй может быть и не виден в ФС. NamedTemporaryFile можно создать с ключем delete=False , чтобы он не был удален. А TemporaryFile всегда будет удален при закрытии.
Режим открытия временного файла по умолчанию «w+b» , т.е. можно писать и читать бинарный данные. Можно изменить передав аргумент mode :
tempfile.NamedTemporaryFile(mode='w')
TemporaryDirectory – создает временную директорию и возвращает строку – путь к ней. Мы можем создавать в директории любые файлы в любом количестве. После закрытия контекстного менеджера директория и все файлы в ней будут автоматически удалены. Очень удобно! Можно не запоминать названия или ссылки на файлы. Пример:
with tempfile.TemporaryDirectory() as temp: with open(os.path.join(temp, '1.txt'), 'w') as f: f.write('hello')
Если надо вручную очистить (можно только 1 раз, после она будет удалена):
tmp = tempfile.TemporaryDirectory() with open(os.path.join(tmp.name, '1.txt'), 'w') as f: f.write('hello') tmp.cleanup() # очистка
Узнать где хранятся временные файлы:
>>> tempfile.gettempdir() '/var/folders/m8/1_wxy73215q9n2vrjetnw0xjc0000gn/T'
Эта директория берется из переменных окружения TMPDIR , TEMP , TEMP или это директория C:\TEMP, C:\TMP, \TEMP и \TMP (для Windows) или /tmp, /var/tmp и /usr/tmp для остальных систем.
Как поменять место хранения временных данных процесса?
- Изменить переменную окружения: TMPDIR=»/home/me/temp» python my_program.my
- Передать в функции создания временных файлов аргумент dir с нужным путем: tempfile.NamedTemporaryFile(dir=’/home/me’)
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway