我正在编写一个代码,以便每月在一个文件夹中重命名多个文件,目前我们必须在我的公司内手动重命名。我对Python相当陌生,目前在Python速成班的列表中。
我成功地整理了以下代码,但我有一些问题:
import os
import glob
#Asks the user for the current month for renaming and for the path of the
#files
month = input("Which month's reports? Type the full name of the month: ")
path = input("Enter the file path: ")
pattern = path + "\A_BCD_012345" + "*.pdf"
result = glob.glob(pattern)
for file_name in result:
old_name = file_name
new_name = path + '\\' + old_name[90:99] + month + ' Report' + old_name[-4:]
print(new_name)现在,我的问题是如何使用通配符,使其更加灵活,因为我当前的代码不是很好。这些文件看起来总是一样的: A_BCD_0123456_20220901_20220930_02_V2_0000_00000_FILE_5-8数字,这对keep_AB0001.pdf很重要
我希望文件重命名为: 5-8位数的重要数字+公司名称+当月报告。
我应该在哪里搜索才能完成代码?我知道我已经非常接近了,os.rename函数仍然缺失,因为我还不想添加它,所以只有通配符在我的脑海中闪现。重要的数字总是在第10下划线之后和第11下划线之前。在第十一个下划线之后,我想要清除所有的东西来重命名我想要的名字。
发布于 2022-10-11 19:41:12
好吧,你最后的评论让它更清楚了。
首先,需要从文件名中提取数据,而不是从整个路径名中提取数据。否则,如果dir名称中有_,那么您将遇到与切片相同的问题。
然后,从这个部分,您可以,例如,使用split从'_‘分离,并从其中提取您想要的部分。
看起来就像
import pathlib
dir = pathlib.Path(path)
result = dir.glob("A_BCD_012345*.pdf")
for fullpath in result:
filename = fullpath.stem
num = filename.split('_')[10]
new_name = num + month + " Report" + fullpath.suffix
new_fullpath = dir / new_name
# os.rename(str(fullpath), str(new_fullpath))在这里,pathlib为您提供了两件事
没有父目录名的文件名的
_或其中可能包含的字母数,,
。
此外,它还可以帮助您创建更独立的操作系统。如您所见,我的代码中没有\。路径库的操作符/使用操作系统所需的分隔符连接具有内容名称的父目录(因此,它将是windows上的\,以及unix的/ );还避免了当连接路径字符串(有\\而不是\)时出现的冗余。
但是,路径解放在这里并不重要。你不用它就行了。我只是趁这个机会在这里展示一下。您也可以保留您的glob.glob。但是,您需要提取用于提取的文件名(没有路径),如果您不想像您所说的那样,对路径中的内容做出假设(方法的字符数或新方法的字符数)。
例如,您也可以使用os.path.filename来完成这一任务。
所以另一个更接近你的版本
import os
import glob
#Asks the user for the current month for renaming and for the path of the
#files
month = input("Which month's reports? Type the full name of the month: ")
path = input("Enter the file path: ")
pattern = path + "\A_BCD_012345" + "*.pdf"
result = glob.glob(pattern)
for file_name in result:
old_name = file_name
number = os.path.filename(file_name).split('_')[10]
new_name = path + '\\' + number + month + ' Report' + old_name[-4:]
print(new_name)(注意:变量名"file_name“在这里不是最好的选择,因为在没有目录的情况下区分完整路径和文件名(文件名)是很重要的。)
最后一点:您可能还想阅读正则表达式(python中的模块re )。它们对于提取这种信息是非常有用的。例如,如果您在将来发现,有时在所要的部分之前只有9_,而不是10,但是有一种模式可以帮助判断哪个是重要的部分,那么简单的split可能不会切割它,当使用正则表达式时,您可以使用一行代码进行复杂的提取。
https://stackoverflow.com/questions/74031315
复制相似问题