我在Python课程中,无法弄清楚为什么我的代码不起作用:
import os
def rename_files():
file_list = os.listdir(r"C:\Users\Kyle\Desktop\prank")
for file_name in file_list:
os.rename(file_name, file_name.translate(None,"0123456789"))
rename_files()
上面的代码返回:
Traceback (most recent call last):
File "C:/Users/Kyle/Desktop/renamepy.py", line 5, in <module>
for file_name in file_list:
NameError: name 'file_list' is not defined
>>>
为什么没有定义file_name
?
答案 0 :(得分:2)
这是缩进错误。您的for
循环超出了rename_files()
的范围,因为它没有缩进。它应该是:
import os
def rename_files():
file_list = os.listdir(r"C:\Users\Kyle\Desktop\prank")
for file_name in file_list:
os.rename(file_name, file_name.translate(None,"0123456789"))
rename_files()
答案 1 :(得分:0)
让我们来看看您的代码:
def rename_files():
file_list = os.listdir(r"C:\Users\Kyle\Desktop\prank")
在rename_files()
函数中,您定义了一个不返回任何内容的函数。您已经设置了一个本地作用域file_list
,它将被释放,一旦您不在该函数之外就无法访问。
for file_name in file_list:
os.rename(file_name, file_name.translate(None,"0123456789"))
rename_files()
然后,当您在rename_files()
函数之外时,尝试访问先前未在for循环中初始化的file_list
,因此它会抛出{{1} }
NameError
然后你调用了NameError: name 'file_list' is not defined
函数,但函数外部仍然不存在rename_files()
。
在进行for循环之前,有几种方法可以确保实现file_list
。
解决方案1 :使用全局变量。
file_list
解决方案2 :在函数外部进行file_list = []
def rename_files():
global file_list
file_list = os.listdir(r"C:\Users\Kyle\Desktop\prank")
rename_files()
for file_name in file_list:
os.rename(file_name, file_name.translate(None,"0123456789"))
初始化。
file_list
解决方案3 (按照Karin的建议):将for-loop放入函数中:
file_list = os.listdir(r"C:\Users\Kyle\Desktop\prank")
for file_name in file_list:
os.rename(file_name, file_name.translate(None,"0123456789"))
注意:这与解决方案2类似,因为他们试图将def rename_files():
file_list = os.listdir(r"C:\Users\Kyle\Desktop\prank")
for file_name in file_list:
os.rename(file_name, file_name.translate(None,"0123456789"))
初始化和for循环放在同一范围内。
答案 2 :(得分:0)
你需要缩进你的for循环,以便它在file_list
函数体内:
rename_file
由于import os
def rename_files():
file_list = os.listdir(r"C:\Users\Kyle\Desktop\prank")
for file_name in file_list:
os.rename(file_name, file_name.translate(None,"0123456789"))
rename_files()
仅在方法范围内。