【问题标题】:Argument is URL or path参数是 URL 或路径
【发布时间】:2021-01-18 21:59:08
【问题描述】:

当我有一个命令行应用程序采用一个参数时,Python 的标准做法是什么

网页的网址

磁盘上某处的 HTML 文件的路径

(只有一个)

代码够了吗?

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

【问题讨论】:

    标签: python argv


    【解决方案1】:
    import urlparse
    
    def is_url(url):
        return urlparse.urlparse(url).scheme != ""
    is_url(sys.argv[1])
    

    【讨论】:

    • Python 3 版本:import urllib urllib.parse.urlparse(url).scheme != ""
    • 这对于像c:\users\user\foo.txt这样的Windows文件路径返回true。
    • 最好检查urlparse(uri).scheme in ('http', 'https',)是否因为Windows uri或uri以file://开头。
    【解决方案2】:

    取决于程序必须做什么。如果它只是打印它是否有一个 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])
    

    【讨论】:

    • open() 也会抛出异常。
    • 不要忘记except IndexError:,因为用户可能没有指定参数,这会引发索引错误。还是我错了?
    • @Griffin:为了回答这个问题,我认为这是一个单独的问题。
    • @rplnt:是的,OP 可能想也可能不想检查IOError。我只是展示urlopenopen 可以如何组合,而不是如何解决更大的问题。这个 sn-p 足以编写一个通用的 open_url_or_file 函数,它只是重新引发它从 open 获得的内容。
    • @larsmans 可能是这样,但从外观上看,OP 不知道如何使用异常处理程序。我看不出有任何理由不包含它,因为如果未指定参数,它将无法工作。
    【解决方案3】:

    Larsmans 可能有效,但它不会检查用户是否实际指定了参数。

    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)
    

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 1970-01-01
      • 2018-03-22
      • 2017-03-19
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      相关资源
      最近更新 更多