У меня есть два CSV-файла с одинаковой структурой.
file1.csv:
352075|6505286781|6505286781|165|A|2.6.37-3.2|25353gb1FAa8
172238|8136090512|8136090512|1|A|2.6.37-3.2|255411429E02
105767|1783707658|1783707658|82|A|2.6.37-3.2|375g1043DC92
352092|2214612065|2214612065|22|A|2.6.37-3.2|07k9975cad1e
file2.csv:
274451|24575|24575|3872531727|23|24575|2017-11-08 11:43:21.15|2017-11-25 16:30:21.061|STB|375g1043DC92|375g1043DC92
506406|280335|280335|4516157218|22|280335|2017-11-22 15:44:54.307|2017-11-29 11:26:02.123|STB|256d9739d3cc|256d9739d3cc
367536|163226|163226|5007632889|9|163226|2017-11-15 20:37:02.034|2017-11-28 20:55:24.891|STB|25353gb1FAa8|25353gb1FAa8
374253|254874|254874|9263432532|23|254874|2017-11-16 19:17:52.827|2017-11-28 19:25:23.805|STB|37fe9739b5a0|37fe9739b5a0
Мне нужно проверить данные из файла1 в файле2 (данные из файла1 из столбца [6]).
Я хотел бы использовать Python для этого. Я попытался:
import csv
with open('file1.csv', newline='') as csvfile:
list1 = csv.reader(csvfile, delimiter='|')
for row in list1:
print(row[6])
Но как я могу проверить эти данные одну за другой в file2.csv
и, если они есть, распечатать их, если их нет, выполнить другую операцию?
Для тех, кто нашел этот вопрос и предпочитает решение bash. Следующий скрипт предоставляет ту же функциональность в меньшем количестве строк.
Хотя, вероятно, существует более эффективный в вычислительном отношении метод. Это был мой быстрый способ получить выходные данные из grep "$i" "$DRC"
, не удосуживаясь выполнить какие-либо команды дважды. Если вывод grep "$i" "$DRC"
не нужен. if grep -q "$i" "$DRC"
будет служить тестом.
#!/bin/bash
SRC=/path/to/file1.csv
DRC=/path/to/file2.csv
for i in $(cut -d "|" -f 7 "$SRC")
do
LINE="$(grep "$i" "$DRC")"
if [ $? == 0 ]
then
echo "$i Found in $LINE"
else
echo "$i NOT Found"
fi
done
Вы даже не должны были бы использовать csv.reader()
для того, чтобы сделать это. Вот пример (работающий в python 3.6), как сделать это без, просто с помощью встроенных функций Python и sys
библиотека для парсинга командной строки. Таким образом, вот пример один без csv
библиотека, позволяет, называют его search_basic.py
:
#!/usr/bin/env python3.6
from sys import argv
def parse_files(name_1, name_2):
"""Opens two files and checks if pos #6 in each row of file 1 is present in file2 via simple build-ins"""
try:
with open(file=name_1) as file_1, open(file=name_2) as file_2:
data_1 = file_1.readlines()
data_2 = file_2.readlines()
mapping = {
row.strip('\n').split('|')[-1]: row.strip('\n').split('|')
for row in data_2
}
for row in data_1:
last_column = row.strip('\n').split('|')[-1]
if last_column in mapping:
print(f'{last_column} found in {mapping[last_column]}')
else:
print(f'{last_column} not found, doing other operation')
except FileNotFoundError as error:
print('{}'.format(error))
exit(1)
else:
return
if __name__ == "__main__":
if len(argv) <= 1:
print('No parameters given...')
exit(1)
elif len(argv) == 2:
print('Only one file was given...')
exit(1)
else:
parse_files(argv[1], argv[2])
exit(0)
Но если Вы настаиваете на том, чтобы использовать csv
библиотека здесь является примером (работающий в python 3.6) два выполнения его с csv.reader()
, давайте назовем его search_csv.py
:
#!/usr/bin/env python3.6
import csv
from sys import argv
def parse_files(name_1, name_2):
"""Opens two files and checks if pos #6 in each row of file 1 is present in file2 via simple build-ins"""
try:
with open(file=name_1) as file_1, open(file=name_2) as file_2:
mapping = {
row[-1]: row
for row in csv.reader(file_2, delimiter='|')
}
for row in csv.reader(file_1, delimiter='|'):
last_column = row[-1]
if last_column in mapping:
print(f'{last_column} found in {mapping[last_column]}')
else:
print(f'{last_column} not found, doing other operation')
except FileNotFoundError as error:
print('{}'.format(error))
exit(1)
else:
return
if __name__ == "__main__":
if len(argv) <= 1:
print('No parameters given...')
exit(1)
elif len(argv) == 2:
print('Only one file was given...')
exit(1)
else:
parse_files(argv[1], argv[2])
exit(0)
Конечно, Вам нужны к chmod оба файла для разрешения выполнения:
chmod 755 search_basic.py
chmod 755 search_csv.py
Данный Ваш выше file1
и file2
, оба производят тот же вывод со строкой ./search_basic.py file1 file2
(или соответствующий ./search_csv.py file1 file2
):
25353gb1FAa8 found in ['367536', '163226', '163226', '5007632889', '9', '163226', '2017-11-15 20:37:02.034', '2017-11-28 20:55:24.891', 'STB', '25353gb1FAa8', '25353gb1FAa8']
255411429E02 not found, doing other operation
375g1043DC92 found in ['274451', '24575', '24575', '3872531727', '23', '24575', '2017-11-08 11:43:21.15', '2017-11-25 16:30:21.061', 'STB', '375g1043DC92', '375g1043DC92']
07k9975cad1e not found, doing other operation