0

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

2 回答 2

3

这与功能范围有关。由于您的 main 函数稍后定义了自己的文件变量,因此内置的文件函数被破坏了。因此,当您最初尝试调用它时,它会抛出此错误,因为它为自己保留了本地文件变量。如果您要将此代码从主函数中取出或在您的 with open() 语句中更改稍后对“文件”的引用,它应该可以工作。

但是我会做以下事情......

代替:

for line in file(timedir + "/change_authors.txt"):

你应该使用:

for line in open(timedir + "/change_authors.txt", 'r'):

open ( ) 函数应该用于返回一个文件对象,并且比file()更可取。

于 2013-01-04T00:10:54.180 回答
1

您不应该使用file()打开文件系统上的文件:使用open(在导致错误的行)。


该文档建议反对它

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

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

2.2 版中的新功能。

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

于 2013-01-04T00:11:01.950 回答