Переименуйте имя файла в каталоге, используя для l oop python - PullRequest
1 голос
/ 23 февраля 2020

У меня есть папка со следующим содержимым:

  1. одна папка с именем: 1_blocks
  2. список 19 файлов CSV по годам: London_255_1999.csv, London_255_2000.csv,…, London_255_2017.csv
  3. еще один файл CSV: London_xyz_combined_output_all_years.csv

Задача состоит в том, чтобы переименовать только 19 файлов CSV, используя для l oop, начиная с London_255_1999.csv,…, London_255_2017.csv в London_245_1999.csv,…, London_245_2017.csv (то есть замена 255 на 245 в каждом заданном имени файла).

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

path = r'A:\Engineering'

for f in os.listdir(path):
    if f.startswith("London_255") and not f.endswith('years.csv'): 
      f_name, f_ext = os.path.splitext(f)

      f_site, f_strings, f_year = f_name.split('_')

      f_strings='245'
      f_site=f_site
      f_year=f_year

      new_name = '{}_{}_{}{}'.format(f_site, f_strings, f_year, f_ext)

      os.rename(f,new_name)

Пожалуйста, предложите самый простой способ переименования, если таковой имеется. Я получаю следующую ошибку:

f_site, f_strings, f_year = f_name.split('_')
ValueError: not enough values to unpack (expected 3, got 2)

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Проблема с использованием str.split('_') -метода вместе с распаковкой результатов ровно в 3 переменные заключается в том, что вы должны гарантировать, что в каждой строке есть ровно два подчеркивания, которые вы хотите разделить.

Ошибка сообщение ValueError: not enough values to unpack (expected 3, got 2) указывает, что в вашем каталоге есть строка с одним подчеркиванием.

См .:

a, b, c = "foo_bar".split("_")
ValueError: not enough values to unpack (expected 3, got 2)

Таким образом, ваш код должен работать, если в списке есть только те файлы, которые вы перечислили данная папка. Но кажется, что это не так.

Кажется, что есть по крайней мере один файл (это также относится к папке) только с одним подчеркиванием в данной папке, который также начинается с London_255 и делает не заканчивается на years.csv.

Таким образом, вы можете просто проверить, содержит ли строка 2 подчеркивания, прежде чем разбивать и распаковывать ее, или заглянуть в каталог и управлять файлами в папке вручную.

1 голос
/ 24 февраля 2020

Я изменил ваш код, чтобы использовать регулярное выражение, чтобы найти правильный формат файла и игнорировать последний CSV, который вы упомянули. После правильного сопоставления он использует встроенные библиотеки os и shutil для переименования файлов csv в новый формат, который вы указали.


import shutil, os, re

# create a regex that finds files
# within the specified directory
# that fits the format you wrote about
# above
# Essentially, this regex statement is saying look 
# for the following pattern [any amount of letters]_[3 digits]_[4 digits].csv
file_format_pattern = re.compile(r'[\w]+_[\d]{3}_[\d]{4}\.csv')

path = r'A:\Engineering'

for file in os.listdir(path):
# Loop over the files in the working directory.
    correct_file = file_format_pattern.search(file)
    # Skip files that aren't in the correct format
    if correct_file:
        f_name, f_ext = os.path.splitext(file)
        f_site, f_strings, f_year = f_name.split('_')
        # New Filename with 245 format instead of 255
        new_filename = f_site + "_245_" + f_year + f_ext

        # Get the full, absolute file paths.
        absWorkingDir = os.path.abspath(path)
        original_file = os.path.join(absWorkingDir, file)
        renamed_file = os.path.join(absWorkingDir, new_filename)

        # With shutil rename original filenames to new filename format
        shutil.move(original_file, renamed_file)  

Вы можете научиться множеству интересных способов упорядочить, переписать, прочитать и изменить файлы автоматически, следуя этой удивительной книге по автоматизации под названием «Автоматизация скучного материала» Аль Суигарта.

Это бесплатно онлайн здесь и учит вас, как использовать Python для автоматизации в понятной форме.

Я в основном следовал главе здесь , чтобы помочь с вашим вопросом.

Чтобы лучше понять шаблоны регулярных выражений, ознакомьтесь с главой 7 книги. Я работал над этим на моей рабочей станции, и он правильно переименовал файлы CSV в формате 255 и проигнорировал окончательный CSV.

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы, и надеюсь, что это поможет. Ура!

...