【问题标题】:Python, how can I rename several files based off a list?Python,如何根据列表重命名多个文件?
【发布时间】:2012-08-08 15:19:55
【问题描述】:

在 Windows 中使用 python 我试图一次重命名同一文件夹中的多个文件,但我无法使用列表进行重命名,这就是我在尝试我的代码时收到此错误的原因:

os.rename(dirlist[1], words[1]) WindowsError: [错误 2] 系统 找不到指定的文件

这里是示例代码:

import os
import sys
words = os.listdir('C:/Users/Any/Desktop/test')
dirlist = os.listdir('C:/Users/Any/Desktop/test')

words = [w.replace('E', 'e') for w in words]
print words 

os.rename(dirlist[1], words[1])

我想要实现的是让我的 python 脚本在一个选择的文件夹上运行,该脚本将把所有的文件放在里面并重命名它们。但是当我不能单独列出文件夹名称并将它们重命名时,棘手的部分就出现了,因为它们已附加到列表中。

【问题讨论】:

    标签: python windows list rename


    【解决方案1】:

    os.listdir 只返回基本名称结果。不是完整路径。它们不存在于您当前的工作目录中。你需要用 root 重新加入他们:

    root = 'C:/Users/Any/Desktop/test'
    for item in os.listdir(root):
        fullpath = os.path.join(root, item)
        os.rename(fullpath, fullpath.replace('E', 'e'))
    

    更新

    针对您关于如何执行大量替换的评论,我建议您可以使用translatemaketrans

    让我们从我们的 dict 和一个源字符串开始:

    d = {'E': 'e', 'a': 'B', 'v': 'C'}
    s = 'aAaAvVvVeEeE'
    

    首先,让我向您展示一个非常原始的入门级方法的示例:

    for old, new in d.iteritems():
        s = s.replace(old, new)
    
    print s
    # BABACVCVeeee
    

    该示例循环遍历您的字典,多次调用替换。它使用简单的语法,并且非常有意义。但是不得不为每个字符串循环遍历字典并多次调用replace,这有点糟糕。

    我相信还有很多其他方法可以做到这一点,但另一种方法是创建一个翻译表,然后为每个字符串重复使用它:

    import string
    
    old, new = zip(*d.items())
    print old, new
    # ('a', 'E', 'v') ('B', 'e', 'C')
    
    old_str, new_str = ''.join(old), ''.join(new)
    print old_str, new_str
    # aEv BeC
    
    table = string.maketrans(old_str, new_str)
    
    print s.translate(table)
    # BABACVCVeeee
    

    这会将字典拆分为键和值元组。然后我们加入然后介绍字符串并将它们传递给maketrans,这将给我们一个表。我们只需要这样做一次。现在我们有了一个表格,可以用它来翻译任何字符串。

    【讨论】:

    • 太棒了!非常感谢jdi
    • 很高兴为您提供帮助。使您免于执行两个 listdir :-)
    • 我很好奇,但有没有办法用整个字典代替“('E','e')”,例如:d = {'a':'B','v' :'C' }
    • 查看“maketrans”here 或者如果您想要更原始的入门级方法,您可以在 dict 上的 for 循环中执行此操作
    • 我不确定 maketrans 能如何帮助我阅读了很多内容。使用您的代码,我尝试进行类似于“('E','e')”示例的7个变量更改,但我希望能够将我需要进行的所有更改作为字符串列出,例如d = {' a':'B', 'v':'C' } 然后将 d 放入您的代码中。
    【解决方案2】:

    错误来了是因为你当前的工作目录没有指向'C:/Users/Any/Desktop/test',如果你使用python 2.7,默认指向c:\python27,你可以通过os.getcwd()检查你的,所以你应该改变在应用该重命名之前,您当前的工作目录到 'C:/Users/Any/Desktop/test'

    使用os.chdir() 更改当前工作目录。

    import os
    import sys
    words = os.listdir('C:/Users/Any/Desktop/test')
    dirlist = os.listdir('C:/Users/Any/Desktop/test')
    
    words = [w.replace('E', 'e') for w in words]
    print words 
    
    os.chdir('C:/Users/Any/Desktop/test')  #this changes the current working directory
    os.rename(dirlist[1], words[1])
    

    【讨论】:

    • 出于好奇......你没有对我投反对票,然后在我之后发布一个非常相似的答案吗?不是指责..只是问。
    • @jdi 我为什么要对你投反对票?我建议他使用os.chdir(),这与您的答案不相似,或者是吗?
    • 哈。我只是在问,因为反对票对我的回答毫无意义。你在我的被接受后添加了一些东西。想也许你恨我 :-) 不,你肯定是一个不同的角度。
    • +1 - 做一个好人并提供良好的竞争:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2019-06-11
    • 2021-07-05
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多