Пакетное переименование части имени файла из файла поиска

edit : см. нижнюю часть моего возможного решения

У меня есть каталог ~ 12 700 текстовых файлов.

У них есть такие имена:

1 – Re / Report Novenator публичный призыв к похоронам – by Lizbett on Thu, 10 Sep 2009.txt

Где ведущие цифровые приращения с каждым файлом (например, последний файл в каталоге начинается с «12,700 -»).

К сожалению, файлы не разворачиваются, и мне они нужны. К счастью, у меня есть отдельный CSV-файл, в котором отображаются идентификационные номера, например, 1 в приведенном выше примере действительно должно быть 25 (поскольку перед ним есть 24 сообщения), а 2 должно быть 8, а 3 должно быть 1 и т. Д. , вот так:

OLD_FILEID TIMESORT_FILEID 21 0 23 1 24 2 25 3 

Мне не нужно ничего менять в названии файла, кроме этого единственного ведущего числа, которое мне нужно обменивать со своим связанным значением. В моей голове, как это работает, нужно открыть имя файла, проверить цифры, которые появляются перед тире, посмотреть их в CSV, заменить их связанным значением, а затем сохранить файл с отрегулированным заголовком и перейти на следующий файл.

Какой был бы лучший способ сделать что-то подобное? Я новичок в python, но играл достаточно, чтобы чувствовать себя комфортно, следуя большинству направлений или предложений. Благодаря 🙂

e: следуя инструкциям ниже, я мог бы это сделать, но это не работает, но я не уверен, почему:

 import os import csv import sys #open and store the csv file with open('timesortmap.csv','rb') as csvfile: timeReader = csv.reader(csvfile, delimiter = ',', quotechar='"') #get the list of files for filename in os.listdir('DiggOutput-TIMESORT/'): oldID = filename.split(' - ')[0] newFilename = filename.replace(oldID, timeReader[oldID],1) os.rename(oldID, newFilename) 

Ошибка, которую я получаю:

 TypeError: '_csv.reader' object is not subscriptable 

Я не использую DictReader, но это потому, что, когда я использую csv.reader и печатаю строки, он выглядит так:

 ['12740', '12738'] ['12742', '12739'] ['12738', '12740'] ['12737', '12741'] ['12739', '12742'] 

И когда я использую DictReader, он выглядит так:

 {'FILEID-TS': '12738', 'FILEID-OLD': '12740'} {'FILEID-TS': '12739', 'FILEID-OLD': '12742'} {'FILEID-TS': '12740', 'FILEID-OLD': '12738'} {'FILEID-TS': '12741', 'FILEID-OLD': '12737'} {'FILEID-TS': '12742', 'FILEID-OLD': '12739'} 

И я получаю эту ошибку в терминале:

 File "TimeSorter.py", line 16, in <module> newFilename = filename.replace(oldID, timeReader[oldID],1) AttributeError: DictReader instance has no attribute '__getitem__' 

2 Solutions collect form web for “Пакетное переименование части имени файла из файла поиска”

Это действительно очень просто сделать на Python, просто используя модули csv и os .

Python имеет встроенный словарь типа dict который может использоваться для хранения содержимого файла csv в памяти во время обработки. В принципе, вам нужно будет прочитать файл csv с помощью модуля csv и преобразовать каждую запись в запись словаря, возможно, используя OLD_FILEID поля OLD_FILEID в качестве ключа и TIMESORT_FILEID в качестве значения.

Затем вы можете использовать os.listdir() для получения списка файлов и использовать цикл, чтобы поочередно получить имя каждого файла. (Если вам нужно отфильтровать список имен файлов, чтобы исключить некоторые файлы, посмотрите модуль glob ). Внутри цикла вам просто нужно извлечь номер, связанный с файлом, который можно сделать, используя что-то вроде этого:

 file_number = filename.split(' - ')[0] 

Затем вызовите os.rename() передав имя старого файла и имя нового файла. Новое имя файла можно найти с помощью следующего:

 new_filename = filename.replace(file_number, file_mapping[file_number], 1) 

Где file_mapping – это словарь, созданный из файла csv. Это заменит первое вхождение file_number номером из вашего файла сопоставления.

редактировать

Как указывает Теодор Зеллеке, существует возможность переписать существующий файл буквально после того, что я изложил выше. Несколько возможных стратегий:

  1. Используйте os.rename() чтобы переместить переименованные версии файлов в другой каталог (например, подкаталог текущего каталога или, что еще лучше, временный каталог, созданный с помощью tempfile.mkdtemp() . После того, как все файлы были переименованы, используйте os.rename для перемещения файлов из временного каталога в текущий каталог.
  2. Добавьте расширение к новому имени файла, например, .tmp , при условии, что выбранное расширение не вызовет других конфликтов. После того как все переименования будут выполнены, используйте второй цикл для переименования файлов, чтобы исключить расширение .tmp .

Вот что я закончил с друзьями, если кто-нибудь найдет и ищет:

 import os import csv import sys IDs = {} #open and store the csv file with open('timesortmap.csv','rb') as csvfile: timeReader = csv.reader(csvfile, delimiter = ',', quotechar='"') # build a dictionary with the associated IDs for row in timeReader: IDs[ row[0] ] = row[1] # #get the list of files path = 'DiggOutput-OLDID/' tmpPath = 'DiggOutput-TIMESORT/' for filename in os.listdir('DiggOutput-OLDID/'): oldID = filename.split(' - ')[0] newFilename = filename.replace(oldID, IDs[oldID]) os.rename(path + filename, tmpPath + newFilename) 
  • создать упорядоченный dict из понимания списка?
  • Каков порядок оценки __hash__ и __eq__ для диктатора Python?
  • Python 3 метод обновления словаря карты к списку других словарей
  • Индекс многословного Python
  • Python, сохраните файл dict в базе данных
  • пересечение 100 * 100 элементов и любое предположение о лучшей структуре данных?
  • Как перебирать прокси-сервер в Python?
  • Ошибка ключа Python Отсутствует Dict в вызове API LinkedIn - как вместо этого вызывать значение по умолчанию?
  • Python - лучший язык программирования в мире.