【问题标题】:Parsing a variable from command line to a url将变量从命令行解析为 url
【发布时间】:2017-03-08 06:54:50
【问题描述】:

我有一个名为dlimage 的python 脚本。我想像$ python dlimage.py 1 2 这样在终端中键入一个变量,并让1 and 2 对应于download_web_image 中的url 成为http://www.example.com/1/2.jpg 并下载图像。我该怎么做?

import urllib.request
import argparse

def download_web_image(url):
    urllib.request.urlretrieve(url)

parser = argparse.ArgumentParser()
parser.add_argument("num1", "num2")
args = parser.parse_args()

download_web_image("http://www.example.com/"num1"/"num2".jpg")

编辑 2: 我终于让它工作了。感谢大家的帮助! 有效的代码:

import urllib
import argparse

def download_web_image(url):
    IMAGE = url.rsplit('/',1)[1]
    urllib.urlretrieve(url, IMAGE)

parser = argparse.ArgumentParser()
parser.add_argument("num1")
parser.add_argument("num2")
args = parser.parse_args()

download_web_image("https://www.example.com/{num1}/{num2}.jpg".format(num1=args.num1, num2=args.num2))

【问题讨论】:

  • 你有没有说过“啊”试图记住 optparse 或 argparse API 的细节?
  • @e4c5 对不起,我没关注
  • 你应该告诉我们有什么问题吗?错误?错误的结果? still not working 还不够;我应该给你投反对票!
  • @hpaulj 抱歉。我已经编辑了我的帖子。
  • 所以你甚至没有接触到argparse 的东西。试试import urllib。模块是urllibrequest 是该模块中的函数。

标签: python parsing download urllib argparse


【解决方案1】:

当我尝试你的部分代码时,我得到一个错误:

In [1663]: parser = argparse.ArgumentParser()
In [1664]: parser.add_argument("num1", "num2")
....
ValueError: invalid option string 'num1': must start with a character '-'

add_argument 方法的参数错误。

你应该使用的是:

parser = argparse.ArgumentParser()
parser.add_argument("num1")
parser.add_argument("num2")

在这种情况下,help 将如下所示:

In [1668]: parser.print_help()
usage: ipython3 [-h] num1 num2

positional arguments:
  num1
  num2

optional arguments:
  -h, --help  show this help message and exit

并测试等效于myprog 1 2的输入

In [1669]: args = parser.parse_args(['1','2'])
In [1670]: args
Out[1670]: Namespace(num1='1', num2='2')
In [1671]: args.num1
Out[1671]: '1'
In [1672]: args.num2
Out[1672]: '2'

现在我可以使用以下格式设置 URL:

In [1675]: "https://www.example.com/{}/{}.jpg".format(args.num1, args.num2)
Out[1675]: 'https://www.example.com/1/2.jpg'

所以你的代码有两个问题:

每个参数 num1num2 必须在单独的 add_argument 语句中定义。阅读文档以了解您还可以在该语句中添加什么内容,例如 help。您试图在一个语句中定义 2 个参数,但出现错误。

其次,您需要使用正确的格式。我添加了{}{0}{num1} 样式也可以)。或者在旧的 Py2 样式中:

"https://www.example.com/%s/%s.jpg"%(args.num1, args.num2)

【讨论】:

  • 您好,感谢您的帮助。你知道为什么我仍然收到上面发布的错误吗?我正在使用 Py3,并且 urllib.request 在标准 python 3 库中,所以我不确定我错在哪里。
【解决方案2】:

改一下

parser.add_argument("num1, "num2")

parser.add_argument("num1", "num2")

【讨论】:

  • 两者都给出错误。定义positional 参数时,您只给出一个字符串dest
【解决方案3】:

为此我会使用格式:

download_web_image("http://www.example.com/{num1}/{num2}.jpg".format(num1=args.num1, num2 = args.num2))

这是一个例子:

num1 = 5
num2 = 6
"http://www.example.com/{num1}/{num2}.jpg".format(num1 = num1, num2 = num2)

output:
'http://www.example.com/5/6.jpg'

format 可以很容易地将定义的参数插入到字符串中。

【讨论】:

  • 你好,我试过了,还是不行。我已经在上面发布了我编辑的代码。
  • 格式化函数附加到字符串之外,如下所示:"http://www.example.com/{num1}/{num2}.jpg".format(num1 = num1, num2 = num2)。必须是download_web_image("http://www.example.com/{num1}/{num2}.jpg".format(num1=args.num1, num2 = args.num2))
【解决方案4】:

假设您使用的是 python3,我尝试做一些简单的事情,并且尽可能接近您最初尝试的方法。希望这会有所帮助。

import urllib.request
import sys
def download_web_image(url):
    urllib.request.urlretrieve(url)

download_web_image("http://www.example.com/{0}/{1}.jpg".format(sys.argv[1], sys.argv[2]))

【讨论】:

    【解决方案5】:

    我想你想传递 N 个参数以便生成一个 URL,我会这样做:

    import sys
    args = sys.argv[1:]
    baseURL = "http://www.example.com"
    url = baseURL + "/" + "/".join(args)
    print url
    

    输入:

    $ python dlimage.py 1 2 3.jpg
    

    输出:

    http://www.example.com/1/2/3.jpg
    

    至于下载,你可以试试this answer,或者在url中读取数据并将其写入一个名为最后一个参数的文件:

    import urllib2
    urlResponse = urllib2.urlopen(url)
    urlData = urlResponse.read()
    
    outFile = open(args[-1], 'w')
    outFile.write(urlData)
    outFile.close()
    

    我使用工作代理,下载文件时出现错误,可能会在今天晚些时候在家更新我的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2018-10-06
      相关资源
      最近更新 更多