0

ディレクトリから特定のファイルをマージする機能があります

def merge(path):
    f = open("indexFile","w")
    for path,directory,files in os.walk(path):
        for file in files:
            f1 = open(os.path.join(path,file))
            createCatFile(f1.read())
            print "merging files"
            shutil.copyfileobj(f1, f)
            f1.close()
    f.close()

ファイル オブジェクトをコピーする前に、f1 の内容を関数に渡して処理を行います。問題は、indexFile が作成されているが、ファイルにデータがないことです。空のファイルです。createCatFile()機能は期待どおりに完全に機能します。merge()また、「ファイルのマージ」は、関数が呼び出された回数が出力されます。関数呼び出しを削除するとcreateCatFile()、indexFile が正常に作成されます。

これに関する問題は何ですか?

createCatFile 関数は次のことを行います。

def createCatFile(wordtodocstr):
    global offset
    wordInfo = wordtodocstr.split()
    term = wordInfo[0]
    newtermid = wordInfo[1]
    docList = wordInfo[2::2]
    ctfList = [int(number) for number in wordInfo[3::2]]
    docfr = len(docList)
    wordctf = sum(ctfList)
    catFileList = [term, newtermid, str(offset), str(wordctf), str(docfr)]
    catFileJoin = " ".join(catFileList)
    with open(path2+term, "w") as foutterm:
        foutterm.write(catFileJoin)
        foutterm.close()    
    offset+=1

ありがとうございました。

4

4 に答える 4

2

たぶんf1.read()、ファイルを「消費」し、shutil がコピーするものは何も残っていません。copyfileobjf1.seek(os.SEEK_SET)を呼び出す前に、ファイルを巻き戻してみてください

于 2012-04-18T20:12:34.103 に答える
1

shutil.copyfileobjドキュメントから:

ファイルのようなオブジェクト fsrc の内容をファイルのようなオブジェクト fdst にコピーします。整数長が指定されている場合は、バッファ サイズです。特に、負の長さの値は、チャンク内のソース データをループせずにデータをコピーすることを意味します。デフォルトでは、制御されていないメモリ消費を避けるために、データはチャンクで読み取られます。fsrc オブジェクトの現在のファイル位置が 0 でない場合、現在のファイル位置からファイルの末尾までの内容のみがコピーされることに注意してください。

したがって、基本的に誰もが言っていることは、 read は位置ポインターを EOF に移動するため、 copyfileobj メソッドに読み取るものが何もないファイルを与えることです。

問題を引き起こしているのは関数ではなく、f.read() です。

于 2012-04-18T20:15:22.287 に答える
0

f1.read()を消費しf1ます。そうしないか、最初からやり直してください。

于 2012-04-18T20:12:17.167 に答える
0

.read()ファイルオブジェクトを呼び出した後、ファイルの最後にジャンプしていると思います。

ファイル オブジェクトをコピーする前に、最初に戻ってみてください。

f1.seek(0)
于 2012-04-18T20:13:00.777 に答える