2016-10-14 4 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. , (당신이 그것을 발견 할 때 파일을 소진에도 계속 찾고 있지만) 이후의 모든 루프에
  2. 명중 쓰기, 히트 찾아 csv_reader의 모든 통해보고, 파일이 소진되기 때문에 내부 검색 루프도 실행되지 않습니다, 당신은 마지막 시간으로 같은 값을 쓰는 당신이 그것을 검색하기 전에이 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] 

더 나은 방법은 dict에 입력 CSV를 한 번로드 한 다음 필요에 따라 룩업을 수행하여 반복적 인 (느린) 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