@Sam67

Как сравнить 2 файла csv на python, что бы из 1 файла сохранились только те строки, которые есть в файле 2?

Всем привет!
Такая проблема - у меня есть два файла: 1 содержит множество строк, в каждой из которых около 40 столбцов. 2 файл содержит так же множество строк, но в каждой строке по 1 столбцу. Мне нужно сравнить каждую строку по 40му столбцу, из файла 1, со строками из 2 файла. Если хотя бы одна строка из файла 1 по 40му столбцу совпадает с любой из строк в файле 2, сохранить всю строку в новый файл. Если просто, то , допустим, у нас есть список с какими именами людей мы будем пропускать(это 2 файл), например Коля, Вася, Петя. И просто пришедшая толпа людей с разными фамилиями именами отчествами(файл 1). Нам, вне зависимости от фамилии и отчества(все столбцы кроме 40го) нужно запускать только людей с именами Коля,Вася,Петя.(т.е сохранять в новый файл).
Для решения этой задачи мне сказали использовать змею, но я просто не могу найти инструменты в питоне для решения этой задачи. Сижу уже 3й день и так и не продвинулся.
Заранее спасибо!
P.S. Файлы в формате CSV.
  • Вопрос задан
  • 2771 просмотр
Пригласить эксперта
Ответы на вопрос 3
@nukler
местный юродивый
Может Вам воспользоватся MS excel или Libree ?
Просто как то странно звучит, что Вам посоветовали использовать питон, но у Вас да же логики по которой работать будет программа нет. Вы вообще пишите на питоне?
Ну как бы тут могут Вам написать программу, но эт как то не честно, делать за Вас работу.
Ответ написан
@mirunn
Самый простой вариант:

# представим 1.csv как list из list (здесь разделитель ";" )
with open('1.csv') as f1:
    csv1 = [x.split(';') for x in f1.readlines()]

# 2.csv просто как list
with open('2.csv') as f2:
    csv2 = f2.readlines()

result = []

# для каждого элемента в csv1
for entry in csv1:
# проверяем его 40ой элемент на вхождение в list csv2
    if entry[40] in csv: 
# если да, то перекидываем нужный нам entry в result 
        result.append(entry)

with open('result.csv', 'w') as fo:
        fo.writelines(result)


Тут нет никаких проверок - исходим из того что оба csv не содержат пустых строк и подобного добра :)
Это не самое быстрое решение, но самое наглядное.
Ответ написан
@Barafu_Albino_Cheetah
Примем, что оба файла в память помещаются. Так?
Сначала читаем
import csv

def read_csv(filename):
  result = set()
  with open(filename, newline='') as f1:
    reader = csv.reader(f1)
    for row in reader:
        result.add(', '.join(row))
  return result

А теперь получаем общее.
def main():
  data1 = read_csv("one.csv")
  data2 = read_csv("two.csv")
  common = data1 & data2

Сохранение в файл писать не буду. Писал прямо в коммент, возможны ошибки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы