2016-10-14 105 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