首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重命名文件夹中的文件

重命名文件夹中的文件
EN

Stack Overflow用户
提问于 2022-10-11 16:29:37
回答 1查看 35关注 0票数 0

我正在编写一个代码,以便每月在一个文件夹中重命名多个文件,目前我们必须在我的公司内手动重命名。我对Python相当陌生,目前在Python速成班的列表中。

我成功地整理了以下代码,但我有一些问题:

代码语言:javascript
复制
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下划线之前。在第十一个下划线之后,我想要清除所有的东西来重命名我想要的名字。

EN

回答 1

Stack Overflow用户

发布于 2022-10-11 19:41:12

好吧,你最后的评论让它更清楚了。

首先,需要从文件名中提取数据,而不是从整个路径名中提取数据。否则,如果dir名称中有_,那么您将遇到与切片相同的问题。

然后,从这个部分,您可以,例如,使用split从'_‘分离,并从其中提取您想要的部分。

看起来就像

代码语言:javascript
复制
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为您提供了两件事

没有父目录名的文件名的

  • 提取。因此,不必担心_或其中可能包含的字母数,

  • ,提取后缀。因此,不需要-4 (对于“.pdf”是可以的)

此外,它还可以帮助您创建更独立的操作系统。如您所见,我的代码中没有\。路径库的操作符/使用操作系统所需的分隔符连接具有内容名称的父目录(因此,它将是windows上的\,以及unix的/ );还避免了当连接路径字符串(有\\而不是\)时出现的冗余。

但是,路径解放在这里并不重要。你不用它就行了。我只是趁这个机会在这里展示一下。您也可以保留您的glob.glob。但是,您需要提取用于提取的文件名(没有路径),如果您不想像您所说的那样,对路径中的内容做出假设(方法的字符数或新方法的字符数)。

例如,您也可以使用os.path.filename来完成这一任务。

所以另一个更接近你的版本

代码语言:javascript
复制
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可能不会切割它,当使用正则表达式时,您可以使用一行代码进行复杂的提取。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74031315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档