2016-10-14 106 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足夠小,那不是問題,如果它很大,則可能需要使用適當的數據庫才能快速查找而不會造成內存不足。

由於您的輸入和輸出不對齊(您的輸出應以重複的數字開頭,但由於某種原因,它不會出於某種原因?),因此有些不清楚該邏輯應該放在哪裏。但是,如果目的是使輸入包含file_number, file_tail, category_number,那麼你就可以開始你的代碼(上面的頂層循環)與:

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

與簡單,速度更快:

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