Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,如何根据列表重命名多个文件?_Python_Windows_List_Rename - Fatal编程技术网

Python,如何根据列表重命名多个文件?

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

在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脚本在一个选定的文件夹上运行,脚本将把所有文件都放在那里,并将它们重命名。但棘手的是,当我无法挑出文件夹名称并重命名它们时,因为它们已附加到列表中

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-作为一个好人,提供良好的竞争:-)出于好奇…你没有否决我,然后在我之后发布了一个非常类似的答案,是吗?不是指责…只是问我为什么要投你的反对票?我建议他