UnboundLocalError:赋值前引用的局部变量'file'

时间:2013-01-04 00:08:15

标签: python

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()

2 个答案:

答案 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(在导致错误的行)。


文档recommends against it

  

文件类型的构造函数,在文件对象一节中进一步描述。构造函数的参数与下面描述的open()内置函数的参数相同。

     

打开文件时,最好使用open()而不是直接调用此构造函数。 file更适合于类型测试(例如,写isinstance(f,file))。

     

2.2版中的新功能。

此外,它将在Python 3中消失。