2014-01-15 11 views
5

私はCSVファイルにデータを書き込んでいます。それが終わったら、ファイルを別のディレクトリにコピーします。続行する前に操作が完了するまでPythonが待っています

これはすべてループ内にあるため、2回目の繰り返しが開始されると、コピーされたファイルからデータが読み込まれます。

問題は、2番目の繰り返しが開始されている間にファイルがまだコピーされていることです。これは明らかな問題を引き起こします。

2回目の反復が始まる前に、ループ内の関数全体が完了するのをどのように待つのですか?任意の反復回数で処理を続けることができます。

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

を書くべきですか? – yuvi

+0

あなたのお話はわかりません。ループはforのルールです。: – Harry

+0

まあ、pythonはスクリプト言語であり、コードを同期スレッドとして実行します。これは、行単位で実行され、実行されます。別の操作の後に何らかの操作が必要な場合は、その操作を下に置くだけです。現在のところ、すべてを同時に実行しようとしています – yuvi

答えて

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)) 
関連する問題