2014-12-11 1 views
0

파이썬에서 csv 모듈을 사용하여 CSV 파일을 수정하고 싶습니다.파이썬 CSV 모듈, 루프 내에서 한 번만 명령문 실행

for row in csv 루프에는 i에 대해 한 번만 실행하려는 두 개의 명령문을 포함하는 while 루프가 있습니다. 다음은 코드 스 니펫입니다. list1list2은 두 개의 다른 문자열 목록입니다.

2 문장은 while 루프에 있습니다. 나는 그들을 의도했다.

f = open('file.csv', 'rb') 
csv_in = csv.reader(f, quotechar='"', quoting=csv.QUOTE_NONE) 

list_length = len(list1) 

for row in csv_in: 
    i = 0 
    while i < list_length: 
     if list1[i] == row[0]: 

      # Execute the next 2 lines just once for every i 
       o = open(list2[i], 'wb') 
       csv_out = csv.writer(o, quotechar='"', quoting=csv.QUOTE_NONE) 

      final_list = [row[-2] + ';' + row[-1]] 
      csv_out.writerows([final_list]) 

     i += 1 

f.close() 
o.close() 
+0

질문을 이해할 수 있을지 잘 모르겠습니다. 그 코드는 각 i에 대해 정확히 한 번 실행됩니다. 아니면 그 코드가 첫 번째'csv_in' 행에 대해 실행되기를 원하십니까? –

+0

응답 해 주셔서 감사하지만 Reut이 해결했습니다. – sunny1158

답변

0

i가 이미 사용 된 설정 절약을 사용할 수 있습니다.

f = open('file.csv', 'rb') 
csv_in = csv.reader(f, quotechar='"', quoting=csv.QUOTE_NONE) 
# use a set saving which i's already used 
set_i = set() 
for row in csv_in: 
    i = 0 
    while i < list_length: 
     if list1[i] == row[0]: 

      # Execute the next 2 lines just once for every i using the set 
      if not i in set_i: 
       set_i.add(i) 
       o = open(list2[i], 'wb') 
       csv_out = csv.writer(o, quotechar='"', quoting=csv.QUOTE_NONE) 

      final_list = [row[-2] + ';' + row[-1]] 
      csv_out.writerows([final_list]) 

     i += 1 

f.close() 
o.close() 
+0

고마워요! 이것은 잘 작동합니다. 나는 set()이 무엇을하는지 모르지만 그것을 찾을 것이다. 이것은 믿을 수 없다. 나는 오늘이 문제로 몇 시간 동안 갇혀 있었고 몇 초 만에 대답했습니다! 놀라운 웹 사이트, 놀라운 커뮤니티! – sunny1158

+0

'set'은 별개의 컬렉션을 만듭니다. 'list'를 사용할 수는 있지만'set'은 해시가 더 빨라야합니다. –

0

당신은 단순히 if i == 0: 같은 다른 if가 바로 그 두 줄을 이전 할 수 있습니다.