Как сравнить 2 файла csv на python, что бы из 1 файла сохранились только те строки, которые есть в файле 2?
Всем привет!
Такая проблема - у меня есть два файла: 1 содержит множество строк, в каждой из которых около 40 столбцов. 2 файл содержит так же множество строк, но в каждой строке по 1 столбцу. Мне нужно сравнить каждую строку по 40му столбцу, из файла 1, со строками из 2 файла. Если хотя бы одна строка из файла 1 по 40му столбцу совпадает с любой из строк в файле 2, сохранить всю строку в новый файл. Если просто, то , допустим, у нас есть список с какими именами людей мы будем пропускать(это 2 файл), например Коля, Вася, Петя. И просто пришедшая толпа людей с разными фамилиями именами отчествами(файл 1). Нам, вне зависимости от фамилии и отчества(все столбцы кроме 40го) нужно запускать только людей с именами Коля,Вася,Петя.(т.е сохранять в новый файл).
Для решения этой задачи мне сказали использовать змею, но я просто не могу найти инструменты в питоне для решения этой задачи. Сижу уже 3й день и так и не продвинулся.
Заранее спасибо!
P.S. Файлы в формате CSV.
Может Вам воспользоватся MS excel или Libree ?
Просто как то странно звучит, что Вам посоветовали использовать питон, но у Вас да же логики по которой работать будет программа нет. Вы вообще пишите на питоне?
Ну как бы тут могут Вам написать программу, но эт как то не честно, делать за Вас работу.
Нужно написать используя именно пайтон. Да лол, я учусь на эколога(писал когда-то простенькие скрипты на пыхе). Мне вот выдали такое задание...
Знаю, что скрипт такой сделать, более менее понимающему пайтон человеку не составит труда. Я же - просто в шоке.
Sam67, тогда хотя бы напишите
1. Структуру файла 1.csv.
Хотя бы 2-3 строки из файла, что бы можно было тестировать
2. Структуру файла 2.csv.
Хотя бы 2-3 строки из файла, что бы можно было тестировать.
А то мы тут понапридумываем =)
В питоне нет специальных велосипедов для решения частных задач. Все через if и for, как у всех языков.
# представим 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 не содержат пустых строк и подобного добра :)
Это не самое быстрое решение, но самое наглядное.
Примем, что оба файла в память помещаются. Так?
Сначала читаем
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