0

1 つのフォルダーに保存されているいくつかのファイルに新しいフィールドを追加するために、前述のタスクの関数を作成しようとしています。Python の関数メソッドについて読んで従ったのですが、うまくいきません。誰かがそれについて私を導くことができれば幸いです。

def newfield(infile,outfile):
    infile.readlines()
    outfile = ["%s\t%s" %(item.strip(),2) for item in infile]
    outfile.write("\n".join(output))
    outfile.close()
    return outfile

そして、私はそれを呼び出そうとします:

a = open("E:/SAGA/data/2006last/test/325145404.all","r")
b = open("E:/SAGA/data/2006last/test/325145404_edit.all","w")
newfield(a,b)

さらに、関数を作成するとき、同じ python シェルで呼び出す必要がありますか、それともファイルと同じにしてから呼び出すことができますか?

4

2 に答える 2

1

問題は、作成したリストをoutputファイルと同じ名前に割り当てていることです。また、ファイルからすべての行を読み取り、結果をどこにも代入しないため、リスト内包表記がそれを反復処理するとき、それはすでにファイルの最後にあります。だから、あなたはreadlinesラインを落とすことができます。

def newfield(infile,outfile):
    output = ["%s\t%s" %(item.strip(),2) for item in infile]
    outfile.write("\n".join(output))
    outfile.close()
    return outfile
于 2013-04-03T11:39:11.517 に答える
0

この行infile.readlines()は入力ファイル全体を消費します。変数に割り当てられていないため、すべての行が読み取られて忘れられます。

コンストラクト["%s\t%s" %(item.strip(),2) for item in infile]はリスト内包表記です。この式はリストを返します。これを変数 outfile に代入することにより、outfile の古い値 (おそらくファイル オブジェクト) は忘れられ、リスト内包表記によって返されるリストに置き換えられます。このリスト オブジェクトには書き込みメソッドがありません。リストを別の変数に割り当てることにより、outfile 内のファイル オブジェクトが保持されます。

これを試して:

def newfield(infile,outfile):
    items = ["%s\t%s" %(item.strip(),2) for item in infile]
    outfile.write("\n".join(items))
    outfile.close()
    return outfile
于 2013-04-03T11:38:00.973 に答える