我正在做一个关于Udacity的Python课程。还有一个名为Rename Troubles的类,它提供了以下不完整的代码:
import os
def rename_files():
file_list = os.listdir("C:\Users\Nick\Desktop\temp")
print (file_list)
for file_name in file_list:
os.rename(file_name, file_name.translate(None, "0123456789"))
rename_files()
正如教师解释的那样,这将返回错误,因为Python没有尝试重命名右侧文件夹中的文件。然后他继续检查“当前工作目录”,然后继续指定Python在哪个目录中重命名文件。
这对我没有意义。我们使用for循环专门告诉Python我们要重命名file_list的内容,我们刚刚在rename_files()中指向了我们需要的目录。那么为什么不尝试在该文件夹中重命名呢?为什么我们还需要弄清楚cwd然后改变它?代码看起来完全合乎逻辑而没有任何代码。
答案 0 :(得分:3)
仔细查看os.listdir()
给你的内容。它只返回名称的列表,而不是完整路径。
然后,您将继续os.rename
其中一个名称,相对于您当前的工作目录而言,这些名称将被解释为相对路径。
您可以os.path.join()
os.rename()
搜索data
两个参数前面的路径,而不是弄乱当前的工作目录。
答案 1 :(得分:1)
我认为您的代码需要一些格式化帮助。
基本问题是os.listdir()
返回相对于指定目录的名称(在本例中为绝对路径)。但是您的脚本可以从任何目录运行。操作传递给os.rename()的文件名来解释这个问题。
答案 2 :(得分:1)
查看相对路径和绝对路径,listdir
返回相对于提供给listdir
的路径(在本例中为绝对路径)的名称。然后os.rename
被赋予此相对名称,除非应用程序的当前工作目录(通常是您从中启动应用程序的目录)与提供给listdir
的目录相同,否则将失败。
有几种替代方法可以解决这个问题,更改当前的工作目录:
os.chdir("C:\Users\Nick\Desktop\temp")
for file_name in os.listdir(os.getcwd()):
os.rename(file_name, file_name.translate(None, "0123456789"))
或使用绝对路径:
directory = "C:\Users\Nick\Desktop\temp"
for file_name in os.listdir(directory):
old_file_path = os.path.join(directory, file_name)
new_file_path = os.path.join(directory, file_name.translate(None, "0123456789"))
os.rename(old_file_path, new_file_path)
答案 3 :(得分:0)
您可以从 ANY 现有目录中获取文件列表 - 即
os.listdir("C:\Users\Nick\Desktop\temp")
或
os.listdir("C:\Users\Nick\Desktop")
或
os.listdir("C:\Users\Nick")
等
您用于运行代码的Python解释器实例正在一个独立于您尝试获取信息的目录的目录中执行。因此,为了重命名正确的文件,您需要指定该文件的完整路径(或者运行Python解释器的相对路径)。