Аргумент — URL или путь

Какова стандартная практика в Python, когда у меня есть приложение командной строки, принимающее один аргумент, который

URL-адрес веб-страницы

or

путь к файлу HTML где-то на диске

(единственный)

достаточно кода?

if "http://" in sys.argv[1]:
  print "URL"
else:
  print "path to file"

person xralf    schedule 21.10.2011    source источник


Ответы (3)


Зависит от того, что должна делать программа. Если он просто печатает, получил ли он URL-адрес, sys.argv[1].startswith('http://') может подойти. Если вы действительно должны использовать URL-адрес для чего-то полезного, сделайте

from urllib2 import urlopen

try:
    f = urlopen(sys.argv[1])
except ValueError:  # invalid URL
    f = open(sys.argv[1])
person Fred Foo    schedule 21.10.2011
comment
open() также выдает исключение. - person rplnt; 21.10.2011
comment
Не забудьте except IndexError:, так как пользователь может не указать аргумент, что вызовет ошибку индекса. Или я ошибаюсь? - person Griffin; 21.10.2011
comment
@Griffin: я посчитал это отдельной проблемой для целей этого ответа. - person Fred Foo; 21.10.2011
comment
@rplnt: да, и ОП может или не может захотеть проверить IOError. Я просто показываю, как можно комбинировать urlopen и open, а не то, как решить большую проблему. Этого фрагмента достаточно для написания универсальной функции open_url_or_file, которая просто повторно вызывает то, что она получает от open. - person Fred Foo; 21.10.2011
comment
@larsmans Возможно, но, судя по всему, ОП не знает, как использовать обработчики исключений. Я не вижу причин не включать его, поскольку он не будет работать, если аргумент не указан. - person Griffin; 21.10.2011
comment
Реализация @FredFoo является наиболее правильной обработкой исключений. Обрабатывайте только те исключения, которые вы знаете, как обрабатывать, в противном случае позвольте вызывающей стороне обрабатывать исключения. В этом случае, если есть файл, открытый или прочитанный, или ошибка разрешений и т. Д. Сообщите вызывающей стороне, а не перехватывайте и скрывайте исключение - person xaviersjs; 27.08.2018
comment
Обратите внимание, что если аргументом является URL с ошибкой 404, код замедляется. - person Chris P; 02.05.2020

Ларсманс может работать, но он не проверяет, действительно ли пользователь указал аргумент или нет.

import urllib
import sys

try:
    arg = sys.argv[1]
except IndexError:
    print "Usage: "+sys.argv[0]+" file/URL"
    sys.exit(1)

try:
    site = urllib.urlopen(arg)
except ValueError:
    file = open(arg)
person Griffin    schedule 21.10.2011

person    schedule
comment
Версия Python 3: import urllib urllib.parse.urlparse(url).scheme != "" - person JustAC0der; 01.02.2017
comment
Это возвращает true для путей к файлам Windows, таких как c:\users\user\foo.txt. - person Paulo Raposo; 31.05.2017
comment
Лучше проверить, если urlparse(uri).scheme in ('http', 'https',) из-за Windows uri или uri начинается с file://. - person Mikhail Gerasimov; 21.06.2017