2016-10-14 16 views
0

なぜこれが常に出力CSV内の同じ行を書いているすべてのアイデアは動作しませんか?CSV書き込みが正しく

21 files = glob.glob(path) 
22 csv_file_complete = open("graph_complete_reddit.csv", "wb") 
23 stat_csv_file = open("test_stat.csv", "r") 
24 csv_reader = csv.reader(stat_csv_file) 
25 lemmatizer = WordNetLemmatizer() 
26 for file1, file2 in itertools.combinations(files, 2): 
27   with open(file1) as f1: 
28     print(file1) 
29     f1_text = f1.read() 
30     f1_words = re.sub("[^a-zA-Z]", ' ', f1_text).lower().split() 
31     f1_words = [str(lemmatizer.lemmatize(w, wordnet.VERB)) for w in f1_words if w not in stopwords] 
32     print(f1_words) 
33   f1.close() 
34   with open(file2) as f2: 
35     print(file2) 
36     f2_text = f2.read() 
37     f2_words = re.sub("[^a-zA-Z]", ' ', f2_text).lower().split() 
38     f2_words = [str(lemmatizer.lemmatize(w, wordnet.VERB)) for w in f2_words if w not in stopwords] 
39     print(f2_words) 
40   f2.close() 
41 
42   a_complete = csv.writer(csv_file_complete, delimiter=',') 
43   print("*****") 
44   print(file1) 
45   print(file2) 
46   print("************************************") 
47 
48   f1_head, f1_tail = os.path.split(file1) 
49   print("************") 
50   print(f1_tail) 
51   print("**************") 
52   f2_head, f2_tail = os.path.split(file2) 
53   print(f2_tail) 
54   print("********************************") 
55   for row in csv_reader: 
56    if f1_tail in row: 
57     file1_file_number = row[0] 
58     file1_category_number = row[2] 
59    if f2_tail in row: 
60     file2_file_number = row[0] 
61     file2_category_number = row[2] 
62 
63   row_complete = [file1_file_number, file2_file_number, file1_category_number, file2_category_number ] 
64   a_complete.writerow(row_complete) 
65 
66 csv_file_complete.close() 

これらのプリントは異なるファイル名を示しています。

この

は、コードが入力として使用していますtest_stat.csvファイルです:

1 1,1bmmoc.txt,1 
    2 2,2b3u1a.txt,1 
    3 3,2mf64u.txt,2 
    4 4,4x74k3.txt,5 
    5 5,lsspe.txt,3 
    6 6,qbimg.txt,4 
    7 7,w95fm.txt,2 

そしてここでのコードの出力は何:

1 7,4,2,5 
    2 7,4,2,5 
    3 7,4,2,5 
    4 7,4,2,5 
    5 7,4,2,5 
    6 7,4,2,5 
    7 7,4,2,5 
    8 7,4,2,5 
    9 7,4,2,5 
10 7,4,2,5 
11 7,4,2,5 
12 7,4,2,5 
13 7,4,2,5 
14 7,4,2,5 
15 7,4,2,5 
16 7,4,2,5 
17 7,4,2,5 
18 7,4,2,5 
19 7,4,2,5 
20 7,4,2,5 
21 7,4,2,5 

コメントや修正を提案してください。

答えて

1

あなたはstat_csv_fileを巻き戻すことはありませんしているので、最終的には、csv_readerオーバー(stat_csv_fileのラッパーである)あなたのループがまったくループしていない、とあなたが最後のループで見つかったものは何でも書きます。基本的には、ロジックは次のとおりです。最初のループで

  1. 、(あなたがそれを見つけた場合にも探し続けてもファイルを排気する、)ヒットを見つける、csv_readerのすべてに目を通す、後続のすべてのループで
  2. を打つ書き、この問題を解決するために遅いが、直接的な方法は、あなたがそれを検索する前にstat_csv_file.seek(0)を追加することです

内側の探索ループも実行しないように、ファイルは、疲れている、あなたは前回と同じ値を書き込むに終わります:

53   print(f2_tail) 
54   print("********************************") 
      stat_csv_file.seek(0) # Rewind to rescan input from beginning 
55   for row in csv_reader: 
56    if f1_tail in row: 
57     file1_file_number = row[0] 
58     file1_category_number = row[2] 
59    if f2_tail in row: 
60     file2_file_number = row[0] 
61     file2_category_number = row[2] 

入力CSVをdictに一度ロードしてから、必要に応じてルックアップを実行し、高速のI/Oを繰り返すことで、高速のdictルックアップを優先します。コストはより高いメモリ使用量になります。入力CSVが十分に小さい場合、それはそれは巨大であれば、あなたはメモリを吹くことなく、迅速な検索を取得するために、適切なデータベースを使用する必要があり、問題ではないのです。

それはあなたの入力と出力が整列しないので、ロジックは、(あなたの出力が繰り返さ数字で開始する必要がありますが、それは何らかの理由ではないでしょうか?)、ここではどうあるべきかちょっと不明です。次に置き換える

# Create mapping from second field to associated first and third fields 
tail_to_numbers = {ftail: (fnum, cnum) for fnum, ftail, cnum in csv_reader} 

for row in csv_reader: 
     if f1_tail in row: 
      file1_file_number = row[0] 
      file1_category_number = row[2] 
     if f2_tail in row: 
      file2_file_number = row[0] 
      file2_category_number = row[2] 

    row_complete = [file1_file_number, file2_file_number, file1_category_number, file2_category_number ] 
    a_complete.writerow(row_complete) 

を簡単かつはるかに高速で意図が入力file_number, file_tail, category_numberが含まれていることですしかし、もしあなたが(トップレベルのループ上の)あなたのコードを始めることができます:

try: 
    file1_file_number, file1_category_number = tail_to_numbers[f1_tail] 
    file2_file_number, file2_category_number = tail_to_numbers[f2_tail] 
except KeyError: 
    # One of the tails wasn't found in the lookup dict, so don't output 
    # (variables would be stale or unset); optionally emit some error to stderr 
    continue 
else: 
    # Found both tails, output associated values 
    row_complete = [file1_file_number, file2_file_number, file1_category_number, file2_category_number] 
    a_complete.writerow(row_complete) 
+0

共有するためのおかげでたくさん! –

+0

@MonaJalal:どうぞよろしくお願いいたします。私が作った編集をチェックアウトしてください。オリジナルの答えは(同じファイルを再読み込みを繰り返し、高価である)正しいが、遅い、更新答えはいくつかの桁違いに速く使用するためには、およびブートが簡単であるdict'検索 'でデータをキャッシュすることにより、問題を完全に回避できます。 – ShadowRanger

関連する問題