Guyz,我遇到以下代码的错误,哪里出错了? 任何清理建议也被接受
for line in file(timedir + "/change_authors.txt"):
UnboundLocalError: local variable 'file' referenced before assignment
以下代码:
import os,datetime
import subprocess
from subprocess import check_call,Popen, PIPE
from shutil import copyfile,copy
def main ():
#check_call("ssh -p 29418 review-droid.comp.com change query --commit-message status:open project:platform/vendor/qcom-proprietary/radio branch:master | grep -Po '(?<=(email|umber): )\S+' | xargs -n2")
global timedir
change=147441
timedir=datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
#changeauthors = dict((int(x.split('/')[3]), x) for line in file(timedir + "/change_authors.txt"))
for line in file(timedir + "/change_authors.txt"):
changeauthors = dict(line.split()[0], line.split()[1])
print changeauthors[change]
try:
os.makedirs(timedir)
except OSError, e:
if e.errno != 17:
raise # This was not a "directory exist" error..
with open(timedir + "/change_authors.txt", "wb") as file:
check_call("ssh -p 29418 review-droid.comp.com "
"change query --commit-message "
"status:open project:platform/vendor/qcom-proprietary/radio branch:master |"
"grep -Po '(?<=(email|umber): )\S+' |"
"xargs -n2",
shell=True, # need shell due to the pipes
stdout=file) # redirect to a file
if __name__ == '__main__':
main()
答案 0 :(得分:3)
这与功能范围有关。由于您的主函数稍后定义了自己的文件变量,因此内置文件函数被破坏。因此,当您最初尝试调用它时会抛出此错误,因为它已为自己保留了本地文件变量。如果您要从main函数中取出此代码,或者在open()语句中将后面的引用更改为'file',它应该可以正常工作。
但是我会做以下事情......
而不是:
for line in file(timedir + "/change_authors.txt"):
您应该使用:
for line in open(timedir + "/change_authors.txt", 'r'):
open() function应该用于返回文件对象,优于file()。
答案 1 :(得分:1)
您不应使用file()
在文件系统上打开文件:使用open
(在导致错误的行)。
文件类型的构造函数,在文件对象一节中进一步描述。构造函数的参数与下面描述的open()内置函数的参数相同。
打开文件时,最好使用open()而不是直接调用此构造函数。 file更适合于类型测试(例如,写isinstance(f,file))。
2.2版中的新功能。
此外,它将在Python 3中消失。