Python等待操作完成后再继续的问题

5

我正在将数据写入CSV文件,然后一旦完成,就将文件复制到另一个目录。

这都是在循环中进行的,因此当第二次迭代开始时,它会从已复制的文件中读取数据。

问题在于,在第二次迭代开始时,文件仍在被复制,这会导致明显的问题。

我应该如何等待循环中整个函数完成,然后再开始第二次迭代?它应该能够继续进行任意数量的迭代。

for rule in substring_rules:
    substring(rule)

这个函数:

        def substring(rule, remove_rows=[]):        
            writer = csv.writer(open("%s%s" % (DZINE_DIR, f), "wb"))
            from_column = rule.from_column
            to_column = rule.to_column
            reader = csv.reader(open("%s%s" % (OUTPUT_DIR, f)))
            headers = reader.next()
            index = 0
            from_column_index = None
            for head in headers:
                if head == from_column:
                    from_column_index = index
                index += 1

            if to_column not in headers:
                headers.append(to_column)

            writer.writerow(headers)

            row_index = 0
            for row in reader:
                if rule.get_rule_type_display() == "substring":
                    try:
                        string = rule.string.split(",")
                        new_value = string[0] + row[from_column_index] + string[1]
                        if from_column == to_column:
                            row[from_column_index] = new_value
                        else:
                            row.append(new_value)
                    except Exception, e:
                        print e

                if row_index not in remove_rows:
                    writer.writerow(row)
                row_index += 1
            shutil.copyfile("%s%s" % (DZINE_DIR,f), "%s%s" % (OUTPUT_DIR, f))

把一个循环放在另一个循环下面? - yuvi
3
你不要关闭读取器和写入器。 - jwalker
1
除了@jwalker是正确的事实之外,我会说,不要创建一个完成所有任务的函数,而是创建多个函数,每个函数只执行一些非常特定的任务。这样也更容易调试。 - yuvi
1
你可以通过一次性应用所有规则,使用类似 for row in reader: for rule in substring_rules: ... 这样的方式来避免复制。 - Janne Karila
是的,你应该关闭文件访问对象,如果在开始复制之前没有这样做,那么你至少需要刷新缓冲区。 (关闭也会刷新。)否则,数据可能仍然在缓冲区(内存中),等待写入更多数据(最终不会发生)。 - mknecht
显示剩余3条评论
1个回答

0
问题在于你没有在拷贝文件之前将缓冲区的内容刷新到磁盘上。(当文件对象被垃圾回收时,这个过程会自动完成)
而不是
writer = csv.writer(open("%s%s" % (DZINE_DIR, f), "wb"))
...
shutil.copyfile("%s%s" % (DZINE_DIR,f), "%s%s" % (OUTPUT_DIR, f))

你应该写

wf = open("%s%s" % (DZINE_DIR, f), "wb")
writer = csv.writer(wf)
...
wf.close()
shutil.copyfile("%s%s" % (DZINE_DIR,f), "%s%s" % (OUTPUT_DIR, f))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接