2012-06-28 2 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 очень странным образом. Вы помещаете в нее одну строку, отображаете эту строку, а затем удаляете все содержимое списка, которое всегда только одна строка, прежде чем перейти к следующей строке. В вашем вопросе вы сказали, что хотите просто отобразить строки, поэтому нет необходимости в списке. Если вам нужно отслеживать строки в списке, просто используйте list1.append(row) непосредственно после print row, не используя все дополнительные для цикла и удаления.

# 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 Я использовал это удаление списка, потому что, если бы я выбрал этот выбор снова, он бы добавил строки AGAIN, поэтому у меня были бы дубликаты, поэтому я хотел чтобы сообщить программе, напечатать эти строки из списка1, которые не находятся в csv2 или наоборот, а затем очистить список, чтобы он мог снова добавить строки и распечатать их: P kinda wierd, да, я знаю ^^ Но спасибо за помощь ! :) – Narraxus

+0

Я обновил код, это как вы хотите? – BrtH

2

Вы, вероятно, нужно перемотать или повторно открыть файлы, так как после того, как итерация содержимое сразу, файлы «исчерпаны».

+2

Или, если они относительно малы, просто читать их обоих в памяти, когда вы начинаете. – geoffspear

+0

Я согласен с Wobble. Прочитайте их оба. –

+0

Большое спасибо и как поместить список1 в 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