使用 for 循环重命名目录中的文件名 python
Rename file name in a directory using a for loop python
我有一个包含以下内容的文件夹:
- 一个文件夹名为:
1_blocks
- 按年份列出的 19 个 csv 文件:
London_255_1999.csv
、London_255_2000.csv
、…、London_255_2017.csv
- 另一个 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" 的自动化书籍,您可以学到很多自动组织、重写、读取和修改文件的很酷的方法。
它是免费在线 here,它教您如何以易于理解的方式利用 Python 实现自动化。
我基本上按照 here 章节来帮助您解决问题。
要进一步了解正则表达式模式,请查看本书的第 7 章。我在我的工作站上工作,它正确地重命名了 255 格式的 csv 文件并忽略了最终的 csv。
如果您有任何问题,请告诉我,希望对您有所帮助。干杯!
我有一个包含以下内容的文件夹:
- 一个文件夹名为:
1_blocks
- 按年份列出的 19 个 csv 文件:
London_255_1999.csv
、London_255_2000.csv
、…、London_255_2017.csv
- 另一个 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" 的自动化书籍,您可以学到很多自动组织、重写、读取和修改文件的很酷的方法。
它是免费在线 here,它教您如何以易于理解的方式利用 Python 实现自动化。
我基本上按照 here 章节来帮助您解决问题。
要进一步了解正则表达式模式,请查看本书的第 7 章。我在我的工作站上工作,它正确地重命名了 255 格式的 csv 文件并忽略了最终的 csv。
如果您有任何问题,请告诉我,希望对您有所帮助。干杯!