簡體   English   中英

使用for循環python重命名目錄中的文件名

[英]Rename file name in a directory using a for loop python

我有一個文件夾,其中包含以下內容:

  1. 一個文件夾名為: 1_blocks
  2. 按年份列出 19 個 csv 文件: London_255_1999.csvLondon_255_2000.csv 、...、 London_255_2017.csv
  3. 另一個 csv 文件: London_xyz_combined_output_all_years.csv

任務是使用以London_255_1999.csv , ..., London_255_2017.csv開始的 for 循環僅將 19 個 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)

使用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 個下划線,或者查看目錄並手動控制文件夾中的文件。

我修改了您的代碼以使用正則表達式來查找正確的文件格式並忽略您提到的最終 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)  

遵循 Al Sweigart 所著的名為“Automate the Boring Stuff”的出色自動化書籍,您可以學習許多很酷的方法來自動組織、重寫、讀取和修改文件。

在此處免費在線,它教您如何以易於理解的方式利用 Python 進行自動化。

我基本上按照這里的章節來幫助解決你的問題。

要更多地了解正則表達式模式,請查看本書的第 7 章。 我在我的工作站上進行了這項工作,它正確地將 csv 文件重命名為 255 格式並忽略了最終的 csv。

如果您有任何問題,請告訴我,希望這會有所幫助。 干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM