2012-06-28 60 views
0

我想製作一個程序,用於比較2個.csv文件,並打印其中一行中的行,但不打印其他行。它基本上可以工作,但在此程序中執行2個任務後停止工作:/我是一名Python初學者。Python管理列表

csv=open('c:\Users\***\Desktop\prvi.csv','r') 
csv2=open('c:\Users\***\Desktop\drugi.csv','r') 

list1=[] 
choice=0 
loop=0 
while loop==0: 
    choice=input('Odaberite zeljenu funkciju: \n1)\ 
Usporedi Book1 sa Book2\n2) Usporedi Book2 sa Book1 \n3) Print Book1 \n4) Print Book2 \n5) Izlaz \nOdabir: ') 
    if choice==1: 
     for row in csv: 
      if not row in csv2: 
       list1.append(row) 
       for row in list1: 
        print row 
        del list1[0:len(list1)] 
    elif choice==2: 
     for row in csv2: 
      if not row in csv: 
       list1.append(row) 
       for row in list1: 
        print row 
        del list1[0:len(list1)] 
    elif choice==3: 
     for row in csv: 
      print row 
    elif choice==4: 
     for row in csv2: 
      print row 
    elif choice==5: 
     loop=1 

回答

0

我做了一個如何閱讀這些文件的例子,並且還清理了一下你的代碼,因爲它傷害了我的眼睛:D。您以非常奇怪的方式使用list1。你把一條線放在它上面,顯示那條線,然後刪除列表中的所有內容,它總是隻有一行,然後移動到下一行。在你的問題中,你說你只是想顯示行,所以不需要列表。如果您確實需要跟蹤列表中的行,那麼只需在print row之後直接使用list1.append(row),而不需要額外的for-loop和delete。

# open lines as list, using read().split('\n') instead of readlines(), 
# because readlines() leaves '\n' after the lines. 
csv = open(r'c:\Users\***\Desktop\prvi.csv', 'r').read().split('\n') 
csv2 = open(r'c:\Users\***\Desktop\drugi.csv', 'r').read().split('\n') 
list1 = []  

while True: 
    # never use input(), unless you are using python 3 
    choice = int(raw_input('Odaberite zeljenu funkciju: \n' 
          '1) Usporedi Book1 sa Book2\n' 
          '2) Usporedi Book2 sa Book1 \n' 
          '3) Print Book1 \n' 
          '4) Print Book2 \n' 
          '5) Izlaz \nOdabir: ')) 
    if choice == 1: 
     for row in csv: 
      if not row in csv2: 
       list1.append(row) 
       print row 
     save_file() 
    elif choice == 2: 
     for row in csv2: 
      if not row in csv: 
       list1.append(row) 
       print row 
     save_file() 
    elif choice == 3: 
     for row in csv: 
      print row 
    elif choice == 4: 
     for row in csv2: 
      print row 
    elif choice == 5: 
     break 

def save_file(): 
    with open('output.txt', 'w') as f: 
     f.write('\n'.join(list1)) 
+0

好的,謝謝你veeery :)但我現在怎麼把它放到一個.txt文件。那爲什麼我使用list1作爲什麼我稍後將放入.txt 我使用刪除列表,因爲如果我再次選擇該選擇,它會再次添加行,所以我會重複,所以我想要告訴程序,打印list1中那些不在csv2中的行,反之亦然,然後清除列表,這樣它可以再次添加行並打印它們:P kinda wierd,是的,我知道^^但是,感謝您的幫助! :) – Narraxus

+0

我更新了代碼,是否如你所願? – BrtH

2

您可能需要倒帶或重新打開這些文件,因爲在遍歷內容一次之後,這些文件就會「耗盡」。

+2

或者,如果他們是比較小的,只是看他們倆到內存中,當你開始。 – geoffspear

+0

我同意搖擺。請仔細閱讀。 –

+0

非常感謝,我如何將一個list1放到txt文件中,我知道如何創建一個txt文件,但我一直在這裏搜索,但還沒有找到答案。如何將這些行放入txt文件。 – Narraxus

0

如果你的csv文件中沒有必須保留在輸出中的重複項,我會在這裏使用集合,只是讓Python計算差異。

From the documentation:

差異(其他...)
設置 - 其他 - ...
返回一個新的集合與集合不在其他元素。

csv = set(open(r'c:\Users\***\Desktop\prvi.csv', 'r').read().split('\n')) 
csv2 = set(open(r'c:\Users\***\Desktop\drugi.csv', 'r').read().split('\n')) 

#... 

# get everything in csv1, but not in csv2 
diff1 = csv1 - csv2 
# get everything in csv2, but not in csv1 
diff2 = csv2 - csv1