Python-добавление увеличивающихся чисел к именам файлов в каталоге
Ввод: я хочу добавить увеличивающиеся числа к именам файлов в каталоге, отсортированном по дате. Например, добавить "01_", "02_", "03_"...к этим файлам ниже.
test1.txt (oldest text file)
test2.txt
test3.txt
test4.txt (newest text file)
Вот код до сих пор. Я могу получить имена файлов, но каждый символ в имени файла, кажется, является его собственным элементом в списке.
import os
for file in os.listdir("/Users/Admin/Documents/Test"):
if file.endswith(".txt"):
print(file)
Ожидаемые результаты:
01_test1.txt
02_test2.txt
03_test3.txt
04_test4.txt
С тестом 1, являющимся самым старым, и тестом 4, являющимся самым новым.
Как добавить 01_, 02_, 03_, 04_ к каждому имени файла?
У меня есть попробовал что-то вроде этого. Но он добавляет '01_' к каждому символу в имени файла.
new_test_names = ['01_'.format(i) for i in file]
print (new_test_names)
5 ответов:
Если вы хотите пронумеровать свои файлы по возрасту, вам нужно сначала отсортировать их. Вы вызываете
sortedи передаете параметрkey. Функцияos.path.getmtimeбудет сортировать в порядке возрастания (от старшего к последнему).Используйте
glob.globдля получения всех текстовых файлов в заданном каталоге. На данный момент это не рекурсивное расширение, но рекурсивное расширение является минимальным дополнением, если вы используете python3.Используйте
str.zfillдля строк вида0x_Использование
os.renameпереименовать файлы
import glob import os sorted_files = sorted(glob.glob('path/to/your/directory/*.txt'), key=os.path.getmtime) for i, f in enumerate(sorted_files, 1): try: head, tail = os.path.split(f) os.rename(f, os.path.join(head, str(i).zfill(2) + '_' + tail)) except OSError: print('Invalid operation')Это всегда помогает сделать проверку с помощью
try-except, чтобы поймать любые ошибки, которые не должны происходить.
Это должно сработать:
import glob new_test_names = ["{:02d}_{}".format(i, filename) for i, filename in enumerate(glob.glob("/Users/Admin/Documents/Test/*.txt"), start=1)]Или без понимания списка:
for i, filename in enumerate(glob.glob("/Users/Admin/Documents/Test/*.txt"), start=1): print("{:02d}_{}".format(i, filename))Здесь можно узнать о трех вещах:
glob, что делает этот вид сопоставления файлов проще.enumerate, что позволяет написать цикл с переменной индекса.format, в частности модификатор02d, который выводит двузначные числа (с нулевым заполнением).
test_dir = '/Users/Admin/Documents/Test' txt_files = [file for file in os.listdir(test_dir) if file.endswith('.txt')] numbered_files = ['%02d_%s' % (i + 1, file) for i, file in enumerate(txt_files)]
Два метода форматирования целого числа с ведущим нулем.
1.используйте
.formatimport os i = 1 for file in os.listdir("/Users/Admin/Documents/Test"): if file.endswith(".txt"): print('{0:02d}'.format(i) + '_' + file) i+=12.используйте
.zfillimport os i = 1 for file in os.listdir("/Users/Admin/Documents/Test"): if file.endswith(".txt"): print(str(i).zfill(2) + '_' + file) i+=1
Самый простой способ-это просто иметь переменную, такую как
i, которая будет содержать число и добавлять его к строке, используя какое-то форматирование , гарантирующее, что она будет иметь по крайней мере 2 цифры:import os i = 1 for file in os.listdir("/Users/Admin/Documents/Test"): if file.endswith(".txt"): print('%02d_%s' % (i, file)) # %02d means your number will have at least 2 digits i += 1Вы также можете взглянуть на
enumerateи ещеglobчтобы сделать ваш код еще короче (но убедитесь, что вы понимаете основные принципы, прежде чем использовать его).
Comments