【问题标题】:Python waiting for operation to complete before continuingPython 等待操作完成后再继续
【发布时间】:2014-02-03 21:49:54
【问题描述】:

我正在将数据写入 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))

【问题讨论】:

  • 把一个循环放在另一个循环下面?
  • 我不确定你在说什么?循环是...中的 for 规则:
  • 你不会关闭读写器
  • 除了@jwalker 是正确的事实之外,我想说的是,不是一个函数可以做所有事情,而是创建多个函数,每个函数只做一些非常具体的任务。调试起来也更容易
  • 您可以通过一次应用所有规则来避免复制,使用类似for row in reader: for rule in substring_rules: ...

标签: python multithreading for-loop


【解决方案1】:

问题是您在复制文件之前没有将文件刷新到磁盘以供阅读器使用。 (这在文件对象被垃圾收集时自动完成)

而不是

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-25
    • 2019-11-01
    • 2021-05-06
    • 2021-05-21
    • 2015-10-03
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多