使用Python在目录中重命名多个文件

3

初学者问题:我正在尝试重命名一个目录中的所有 .xlsx 文件。我知道如何用另一个字符替换字符串中的字符,但如何删除它?更具体地说,我在一个目录中有多个文件:0123_TEST_01、0456_TEST_02。等等。我想要删除文件名中的前缀,这将导致以下结果:TEST_01、TEST_02。

我正试图使用 os.rename 并将其放到循环中,但不确定是否应使用 len() 和一些数学来返回正确的命名约定。下面是我的当前代码。如果您觉得不合理,请告诉我。谢谢。

import os
import shutil
import glob

src_files = os.listdir('C:/Users/acars/Desktop/b')

for file_name in src_files: 
       os.rename(fileName, filename.replace())

使用 .find() 查找 _ 的位置。 - timbmg
2个回答

1
只需通过下划线分割文件名,忽略第一个部分,再将其拼接即可。
>>> file_name = '0123_TEST_01'

>>> '_'.join(file_name.split('_')[1:])
'TEST_01'

您的代码将如下所示:

Your code will look like this:

for file_name in src_files:
     os.rename(file_name, '_'.join(file_name.split('_')[1:]))

它抛出了os.rename(file_name, "".join(file_name.split("")[1:])) WindowsError:[Error 2]系统找不到指定的文件。我的src_files位置是否太高了,因为它正在尝试访问b文件夹中的文件? - AndrewC10
@Andrec10,这是因为你需要在os.rename中提供文件的绝对路径。例如,将工作目录保存在变量“path”中,并执行以下操作:os.rename(os.path.join(path,file_name), os.path.join(path, '_'.join(file_name.split('_')[1:]))) - Copperfield

1

只需在下划线处分割一次,使用第二个元素,glob也会为您找到所有的xlsx文件,并返回完整路径

from os import path, rename
from glob import glob

src_files = glob('C:/Users/acars/Desktop/b/*.xlsx')
pth = 'C:/Users/acars/Desktop/b/'

for file_name in src_files:         
    rename(file_name, path.join(pth, path.basename(file_name).split("_",1)[1])

如果您只有 XLSX 文件,并且未使用 glob,则需要连接路径:
from os import path, rename
from glob import glob


pth = 'C:/Users/acars/Desktop/b'
src_files = os.listdir(pth)

for file_name in src_files:
    new = file_name.split("_", 1)[1]
    file_name = path.join(pth, file_name)
    rename(file_name, path.join(pth, new))

@AndrewC10,我应该使用rename而不是os.rename,因为我从os中导入了rename。如果您因文件已存在而收到OsError,则必须已成功执行。当您运行代码时,“print path.join(pth,new)”输出什么? - Padraic Cunningham
抱歉,也许我应该澄清一下。我使用了您的代码顶部版本。我确实导入了glob。它告诉我file_name未定义。以下是我运行的内容。我尝试将路径定义到文件级别并停止在目录级别。pth = 'C:/Users/acars/Desktop/b/*.xlsx' new = file_name.split("_", 1)[1] print path.join(pth, new) - AndrewC10
完美地工作了,非常感谢!我会仔细研究你的代码,看起来是将路径连接和拆分结合在一起的组合。 - AndrewC10
已记录。再次感谢您的帮助。这是自动化软件测试项目的一部分。 - AndrewC10
不用担心,两种方法都可以,但使用glob你就不必对文件进行任何过滤。 - Padraic Cunningham
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接