0

私には次の機能があります。プログラムは各ファイルを調べ、4つのファイルすべてに出現する行を新しいファイルに出力します。試しましfile1.close()たが、セットを閉じるときにエラーが発生しますか?ステートメントを使用できると思いますがwith、これを行う方法がわかりません。プログラミングは非常に初めてです。

def secretome():
    file1 = set(line.strip() for line in open(path + "goodlistSigP.txt"))
    file2 = set(line.strip() for line in open(path + "tmhmmGoodlist.txt"))
    file3 = set(line.strip() for line in open(path + "targetpGoodlist.txt"))
    file4 = set(line.strip() for line in open(path + "wolfPsortGoodlist.txt"))
    newfile = open(path + "secretome_pass.txt", "w")
    for line in file1 & file2 & file3 & file4:
        if line:
            newfile.write(line + '\n')
    newfile.close()
4

4 に答える 4

4

セットの世代を関数に抽出して、繰り返しを削除することをお勧めします。

def set_from_file(path):
    with open(path) as file:
        return set(lines.strip() for line in file)

def secretome():
    files = ["goodlistSigP.txt", "tmhmmGoodlist.txt", "targetpGoodlist.txt", "wolfPsortGoodlist.txt"]
    data = [set_from_file(os.path.join(path, file)) for file in files]
    with open(path + "secretome_pass.text", "w") as newfile:
        newfile.writelines(line + "/n" for line in set.union(*data) if line)

あなたはあなたのコードで交差をしていることに注意してください、しかしあなたはユニオンが欲しいと話しているので、私はunion()ここで使用しました。リスト内包表記/ジェネレータ式もいくつかあります。

于 2012-12-20T14:37:47.163 に答える
1

これを私のオリジナル(Lattywareが私を打ち負かした)とは完全に異なる方向に向けるには:

次の関数を定義できます。

def file_lines(fname):
    with open(fname) as f:
         for line in f:
             yield line

itertools.chainこれで、ファイルを反復処理するために使用できます。

import itertools
def set_from_file(path):
    filenames = ("name1","name2","name3",...)  #your input files go here
    lines = itertools.chain.from_iterable(itertools.imap(file_lines,filenames))
    #lines is an iterable object.  
    #At this point, virtually none of your system's resources have been consumed
    with open("output",'w') as fout:
         #Now we only need enough memory to store the non-duplicate lines :)
         fout.writelines(set( line.strip()+'\n' for line in lines) )
于 2012-12-20T14:38:29.127 に答える
1

これは非常に複雑な方法のようです。ここで示した例のようなものを提案します。

import fileinput
files = ['file1.txt','file2.txt','file3.txt','file4.txt']  
output = open('output.txt','w')

for file in files:
    for line in fileinput.input([file]):
        output.write(line)
    output.write('\n')

output.close()

このコードは、ファイルを含むリストを作成し(名前を必要なファイルパスに置き換えます)、それぞれの出力を格納するファイルを作成し、fileinputモジュールを使用してファイルを繰り返し、各行を1行ずつ印刷します。それが行くように出力ファイルに行します。'output.write(' \ n')'は、次のファイルの行の印刷が出力ファイルの新しい行から開始されるようにします。

于 2012-12-20T14:51:18.320 に答える
0

あなたはそれをジェネレーターに入れることができます:

def closingfilelines(*a):
    with open(*a) as f:
        for line in f:
            yield f

現在使用している場所で使用してくださいopen()

ジェネレーターの実行中、ファイルは開いたままになり、ジェネレーターが使い果たされると、ファイルは閉じられます。

ジェネレータオブジェクトが.close()dまたはドロップされた場合も同じことが起こります。この場合、ジェネレータはGeneratorExit例外を受け取り、with句も残されます。

于 2012-12-20T14:38:16.793 に答える