2017-01-31 1 views
1

Я разрабатываю скрипт, который занимает разницу между двумя файлами csv и создает новый файл csv как вывод с различиями, но только если те же 2 строки (относится к строке число) между двумя входными файлами содержат разные данные, например строка 3 имеет «mike», «баскетболист» в файле 1, а в строке 3 в файле 2 есть «mike», «бейсболист». Выходные данные csv хватали бы их печать и записывали их в csv. Он работает, но есть некоторые проблемы (я знаю, что этот вопрос также задавался несколько раз, но другие делали это по-другому для меня, и поскольку я довольно новичок в программировании, я не совсем понимаю их коды).Попытка сравнить два файла csv и записать разности в качестве вывода

Выходные данные в новом файле csv содержат каждую букву вывода в каждой ячейке (см. Рисунок ниже), и я считаю, что это что-то связано с линией ограничителя/цитаты/цитаты 37. Я хочу, чтобы они были в своих собственных ячейках без любые полные стопы, множественные пробелы, запятые или «|».

Другая проблема заключается в том, что требуется много времени для запуска. Я работаю с наборами данных до 50 000 строк, и это может занять более часа. Почему это и какой совет был бы полезен для его ускорения? Может быть, что-то вне цикла for? Я попытался использовать метод difflib ранее, но я смог распечатать весь «input_file1», но не сравнить этот файл с другим.

# aim of script is to compare csv files and output difference as a new csv 

# import necessary libraries 
import csv 

# File1 = open(raw_input("path:"),"r") #filename, mode 
# File2 = open(raw_input("path:"),"r") #filename, mode 

# selects the 2 input files to be compared 
input_file1 = "G:/savestuffhereqwerty/electorate_meshblocks/teststuff/Book1.csv" 
input_file2 = "G:/savestuffhereqwerty/electorate_meshblocks/teststuff/Book2.csv" 
# creates the blank output csv file 
output_path = "G:/savestuffhereqwerty/electorate_meshblocks/outputs/output2.csv" 
a = open(input_file1, "r") 
output_file = open(output_path,"w") 
output_file.close() 
count = 0 

with open(input_file1) as fp1: 


    for row_number1, row_value1 in enumerate(fp1): 
     if row_number1 == count: 
      print "got to 1st point" 
      value1 = row_value1 

      with open(input_file2) as fp2: 
       for row_number2, row_value2 in enumerate(fp2): 
        if row_number2 == count: 
         print "got to 2nd point" 
         value2 = row_value2 

         if value1 == value2: 
          print value1, value2 
         else: 
          print value1, value2 
          with open(output_path, 'wb') as f: 
           writer = csv.writer(f, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
           # testing to see if the code writes text to the csv 
           writer.writerow(["test1"]) 
           writer.writerow(["test2", "test3", "test4"]) 
           writer.writerows([value1, value2]) 
           print "code reached writing stage" 
     count += 1 
     print count 
print "done" 
# replace(",",".") 

SCREENSHOT OF PRINTED OUTPUT SCREENSHOT OF OUTPUT CSV

+0

У вас есть вложенный цикл более 50000 строк. Вот откуда и начинается длительное время. Вам не нужно сравнивать каждую строку от a с каждой строкой от b! – schwobaseggl

+0

Это потому, что у меня есть цикл for внутри цикла for? Я не знаю, как обращаться к input_file2 в первом цикле. – Crow132

ответ

0

Так как вы хотите, чтобы сравнить эти два файла строка за строкой, вы должны не перебрать второго файла для каждый строки в первом файле. Вы можете просто zip два считывателя в формате CSV и фильтровать строки:

input_file1 = "foo" 
input_file2 = "bar" 
output_path = "baz" 

with open(input_file1) as fin1: 
    with open(input_file2) as fin2: 
    read1 = csv.reader(fin1) 
    read2 = csv.reader(fin2) 
    diff_rows = (row1 for row1, row2 in zip(read1, read2) if row1 != row2) 
    with open(output_path, 'w') as fout: 
     writer = csv.writer(fout) 
     writer.writerows(diff_rows) 

Это решение предполагает, что оба файла имеют одинаковое количество строк.

+0

Удивительная благодарность. Мой вывод дает мне другую строку, но для input_file1. Я пытаюсь понять, что вы написали, что мне изменить, поэтому мой вывод показывает разные строки для input_file2? @schwobaseggl – Crow132

+0

@ Crow132 Вероятно, вы уже узнали об этом. Замените 'row1 for ...' на 'row2 for ...'. Эта строка является [условным выражением генератора] (https://docs.python.org/2/reference/expressions.html#generator-expressions). Это одна из самых удобных функций в Python. Я думаю, что синтаксис довольно понятен ;-) – schwobaseggl

Смежные вопросы