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没有任何东西可以复制。f1.seek(os.SEEK_SET)在调用 copyfileobj 之前尝试倒带文件

于 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 回答