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)
968   5  

5 ответов:

  1. Если вы хотите пронумеровать свои файлы по возрасту, вам нужно сначала отсортировать их. Вы вызываете sorted и передаете параметр key. Функция os.path.getmtime будет сортировать в порядке возрастания (от старшего к последнему).

  2. Используйте glob.glob для получения всех текстовых файлов в заданном каталоге. На данный момент это не рекурсивное расширение, но рекурсивное расширение является минимальным дополнением, если вы используете python3.

  3. Используйте str.zfill для строк вида 0x_

  4. Использование 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))

Здесь можно узнать о трех вещах:

  1. glob, что делает этот вид сопоставления файлов проще.
  2. enumerate, что позволяет написать цикл с переменной индекса.
  3. 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.используйте .format

import os
i = 1
for file in os.listdir("/Users/Admin/Documents/Test"):
    if file.endswith(".txt"):
        print('{0:02d}'.format(i) + '_' + file)
        i+=1

2.используйте .zfill

import 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

    Ничего не найдено.