Вопрос или проблема
Я пытаюсь адаптировать скрипт на Python, чтобы его можно было запустить с файлом CSV, содержащим список значений, т.е. аргументов. Каждая строка в файле CSV требует повторного выполнения скрипта.
Вот мой простой скрипт ‘myscript.py’:
#! /usr/bin/env python3
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('url', help='входной URL')
args = parser.parse_args()
print('Это аргумент')
print(args.url)
который я запускаю с помощью python3 myscript.py https://www.bbc.co.uk
и он выводит:
Это аргумент
https://www.bbc.co.uk
Теперь, если у меня есть файл CSV ‘urls.csv’, я хочу иметь возможность запустить: python3 myscript.py urls.csv
Так, чтобы из списка URL-адресов скрипт запустился необходимое количество раз и выдал:
Это аргумент
https://www.bbc.co.uk
Это аргумент
https://www.itv.com
Это аргумент
https://www.channel4.com
Это аргумент
https://www.channel5.com
Могу ли я добиться этого, используя какую-то вариацию инструкций argparse, или это требует другого скрипта в качестве своего рода обертки?
Ответ или решение
Вы можете адаптировать свой Python-скрипт так, чтобы он считывал значения URL из CSV-файла и запускал основную программу для каждого URL в файле. Для этого вам не потребуется изменять логику использования argparse. Вместо этого можно добавить функциональность для обработки CSV. Вот как это можно сделать:
Шаги для реализации
-
Импортировать необходимые библиотеки: Вам понадобятся
csv
для работы с CSV-файлом иargparse
для обработки аргументов командной строки. -
Чтение CSV файла: Используя библиотеку
csv
, вы сможете прочитать файл и извлечь URL из него. -
Цикл по URL: После получения списка URL вы можете итерироваться по каждому URL и вызывать основную логику вашего скрипта.
Вот как может выглядеть ваш обновленный скрипт:
#! /usr/bin/env python3
import argparse
import csv
import sys
def process_url(url):
print('Это аргумент')
print(url)
def main(args):
if args.input_file:
with open(args.input_file, newline='') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
if row: # Проверка, что строка не пустая
url = row[0]
process_url(url)
else:
# Если URL передан непосредственно, используем его
process_url(args.url)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('url', nargs='?', help='вводимый URL')
parser.add_argument('--input_file', help='CSV файл с URL')
args = parser.parse_args()
main(args)
Объяснение кода
-
Использование
argparse
: В обновленном скрипте добавлен необязательный аргумент--input_file
. Это позволит вам указывать путь к вашему CSV-файлу при запуске. -
Функция
process_url
: Создана отдельная функция для обработки URL, что делает код более чистым и повторно используемым. -
Чтение CSV файла: Если передан аргумент
--input_file
, скрипт открывает файл, считывает строки с помощьюcsv.reader
, а затем обрабатывает каждую строку. В ситуации, еслиurl
также передан, он будет обработан единожды.
Пример запуска скрипта
-
Для запуска скрипта с URL напрямую:
python3 myscript.py https://www.bbc.co.uk
-
Для запуска скрипта с CSV-файлом:
python3 myscript.py --input_file urls.csv
Заключение
Теперь ваш скрипт ‘myscript.py’ может работать как с отдельными URL, так и читать их из CSV-файла, выполняя логику для каждого URL, найденного в файле. Это улучшит гибкость и удобство использования вашего скрипта.