0

Guyz、belwo コードで次のエラーが発生しています。どこで問題が発生していますか? クリーンアップの提案も受け入れられます

    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

これは機能スコープと関係があります。メイン関数が後で独自のファイル変数を定義すると、組み込みのファイル関数が破壊されます。そのため、最初に呼び出そうとすると、ローカルファイル変数が予約されているため、このエラーがスローされます。このコードをメイン関数から削除したり、後でopen()ステートメントで'file'への参照を変更したりすると、機能するはずです。

しかし、私は次のことをします...

それ以外の:

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()ファイルシステムでファイルを開くためにを使用するべきではありません:use open(エラーの原因となった行で)。


ドキュメントはそれに対して推奨しています:

ファイルタイプのコンストラクター関数。ファイルオブジェクトのセクションで詳しく説明します。コンストラクターの引数は、以下で説明するopen()組み込み関数の引数と同じです。

ファイルを開くときは、このコンストラクターを直接呼び出すのではなく、open()を使用することをお勧めします。fileは、型テストに適しています(たとえば、isinstance(f、file)の記述)。

バージョン2.2の新機能。

また、Python3では廃止されます。

于 2013-01-04T00:11:01.950 に答える