Поиск данных из файла file1 в file2

Поскольку

ssh -o PubkeyAuthentication=no your_host

может быть легко отменен любым, у кого есть доступ к клиенту, чтобы войти в ваш laptob, не требуя вообще пароля, возможно, лучше использовать пароль, зашифрованный частный -key для тех мест назначения, где вы хотите получить пароль до входа в систему.

3
задан 3 December 2017 в 12:20

4 ответа

Вам даже не понадобится использовать 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
2
ответ дан 18 July 2018 в 02:21

Для тех, кто находит этот вопрос и предпочитает решение 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
1
ответ дан 18 July 2018 в 02:21

Вам даже не понадобится использовать 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
2
ответ дан 24 July 2018 в 17:32

Для тех, кто находит этот вопрос и предпочитает решение 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
1
ответ дан 24 July 2018 в 17:32
  • 1
    [F1] означает, что строка обнаружена? Могу ли я поменять эхо-строки (строки 10 и 12), если я использую $? != 0? – Rooney 3 December 2017 в 13:10
  • 2
    @Rooney $? расширяется до статуса выхода последней команды. В Bash статус выхода 0 указывает на успех. Но нам не нужна команда [ или test, чтобы проверить статус выхода, потому что это то, что if делает, поэтому if grep -q $i $DRC ; then ... выполнит работу – Zanna 4 December 2017 в 01:31
  • 3
    Я предпочитаю делать if line="$(grep "$i" "$drc")"; then. Я также всегда использую строчные буквы в сценарии, чтобы не было шансов переписать env vars. – wjandrea 4 December 2017 в 07:21

Другие вопросы по тегам:

Похожие вопросы: