2016-09-22 2 views
-1

У меня есть 2 CSV-файла, которые имеют список уникальных слов. После того, как я завершу свое пересечение на них, я получаю результаты, но когда я пытаюсь записать его в новый файл, он создает файл большого размера почти 155 МБ, когда он должен быть значительно ниже 2 МБ.Запись данных пересечения в новый CSV

Код:

alist, blist = [], [] 

with open("SetA-unique.csv", "r") as fileA: 
    reader = csv.reader(fileA, delimiter=',') 
    for row in reader: 
     alist += row 

with open("SetB-unique.csv", "r") as fileB: 
    reader = csv.reader(fileB, delimiter=',') 
    for row in reader: 
     blist += row 

first_set = set(alist) 
second_set = set(blist) 

res = (first_set.intersection(second_set)) 

writer = csv.writer(open("SetA-SetB.csv", 'w')) 

for row in res: 
    writer.writerow(res) 
+0

У вас есть только одно слово в строке? –

ответ

2

Вы писать весь набор res к файлу на каждой итерации. Вы, вероятно, хотите, чтобы написать строки вместо:

for row in res: 
    writer.writerow([row]) 
+1

Привет, теперь он записывается в CSV, но каждое слово делится на несколько столбцов. Пример: Apple -> A | p | p | p | л | e –

+0

@MukeshKumarMishra Я обновил ответ, посмотрим, работает ли это –

0

Помимо написания всего набора каждой итерации вы также не нужно создавать несколько наборов и списки, вы можете использовать itertools.chain:

from itertools import chain 
with open("SetA-unique.csv") as file_a, open("SetB-unique.csv") as file_b,open("SetA-SetB.csv", 'w') as inter : 
    r1 = csv.reader(file_a) 
    r2 = csv.reader(file_b) 
    for word in set(chain.from_iterable(r1)).intersection(chain.from_iterable(r2)): 
     inter.write(word)+"\n" 

Если вы просто пишете слова, то также не нужно использовать csv.writer просто используйте file.write как указано выше.

Если вы на самом деле пытается сделать строку сравнения мудры, вы не должны создавать плоскую Iterable слов, вы можете IMAP наборам:

from itertools import imap 
with open("SetA-unique.csv") as file_a, open("SetB-unique.csv") as file_b,open("SetA-SetB.csv", 'w') as inter : 
    r1 = csv.reader(file_a) 
    r2 = csv.reader(file_b) 
    writer = csv.writer(inter) 
    for row in set(imap(tuple, r1).intersection(imap(tuple, r2)): 
     writer.writerow(row) 

И если у вас есть только одно слово в каждой строке вам вообще не нужен csv lib.

from itertools import imap 
with open("SetA-unique.csv") as file_a, open("SetB-unique.csv") as file_b,open("SetA-SetB.csv", 'w') as inter : 
    for word in set(imap(str.strip, file_a)).intersection(imap(str.strip, file_b)): 
     inter.write(word) + "\n" 
Смежные вопросы