Python,如何根据列表重命名多个文件?
在Windows中使用python我试图同时重命名同一文件夹中的多个文件,但我无法使用列表进行重命名,这就是为什么我在尝试代码时出现此错误的原因: os.rename(dirlist[1],words[1])WindowsError:[错误2]系统 找不到指定的文件 以下是示例代码:Python,如何根据列表重命名多个文件?,python,windows,list,rename,Python,Windows,List,Rename,在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/Des
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脚本在一个选定的文件夹上运行,脚本将把所有文件都放在那里,并将它们重命名。但棘手的是,当我无法挑出文件夹名称并重命名它们时,因为它们已附加到列表中
os.listdir
仅返回basename结果。不是完整路径。它们不存在于您当前的工作目录中。您需要将它们与根连接起来:
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'))
更新
针对您关于如何执行更多替换的评论,我建议您可以使用translate
和maketrans
让我们从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
,这将返回一个表。我们只需要做一次。现在我们有了一个表,可以用它来翻译任何字符串。os.listdir
只返回basename结果。不是完整路径。它们不存在于您当前的工作目录中。您需要将它们与根连接起来:
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'))
更新
针对您关于如何执行更多替换的评论,我建议您可以使用translate
和maketrans
让我们从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
,这将返回一个表。我们只需要做一次。现在我们有了一个表,可以用它来翻译任何字符串。错误来了,因为您当前的工作目录没有指向'C:/Users/any/Desktop/test'
,默认情况下它指向C:\python27
如果您使用的是python 2.7,您可以通过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])
出现错误是因为当前工作目录没有指向
'C:/Users/Any/Desktop/test'
,默认情况下它指向C:\python27
如果您使用的是python 2.7,您可以通过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])
好极了非常感谢你的帮助。我很好奇,有没有办法用一整本字典来代替“('E','E')”,比如:d={'a','B','v','C'}看看“maketrans”或者,如果你想要一个更原始的入门级方法,你可以在dict上做一个for循环。我不知道maketrans如何帮助我阅读了很多。使用你的代码,我试着做7个类似于“('E','E')”示例的变量更改,但我希望能够以字符串形式列出我需要做的所有更改,比如d={'a':'B','v':'C'),然后将d放入你的代码中。太棒了!非常感谢你的帮助。我很好奇,有没有办法用一整本字典来代替“('E','E')”,比如:d={'a','B','v','C'}看看“maketrans”或者,如果你想要一个更原始的入门级方法,你可以在dict上做一个for循环。我不知道maketrans如何帮助我阅读了很多。使用你的代码,我试着做7个类似于“('E','E')”示例的变量更改,但我希望能够以字符串形式列出我需要做的所有更改,比如d={'a':'B','v':'C'),然后将d放入你的代码中。出于好奇……你没有否决我,然后在我之后发布一个非常类似的答案,是吗?不是指责…只是问我为什么要投你的反对票?我建议他使用
os.chdir()。我只是问,因为否决票对我的回答毫无意义。在我的被接受后,你又加了一些东西。我想也许你恨我:-)不,你的肯定是另一个角度。+1-作为一个好人,提供良好的竞争:-)出于好奇…你没有否决我,然后在我之后发布了一个非常类似的答案,是吗?不是指责…只是问我为什么要投你的反对票?我建议他