1

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

os.rename(dirlist[1], words[1]) WindowsError: [Error 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 脚本在一个选择的文件夹上运行,该脚本将把所有的文件都放在里面并重命名它们。但是当我不能单独列出文件夹名称并将它们重命名时,棘手的部分就出现了,因为它们已附加到列表中。

4

2 回答 2

4

os.listdir只是给你返回 basename 结果。不是完整路径。它们不存在于您当前的工作目录中。您需要使用 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'))

更新

为了回应您关于如何执行大量替换的评论,我建议您可以使用translateand 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,这将给我们一个表。我们只需要这样做一次。现在我们有一个表格,可以用它来翻译任何字符串。

于 2012-08-11T18:41:19.707 回答
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])
于 2012-08-11T18:50:52.080 回答