Python 如何解决这种类型的键错误?

Python 如何解决这种类型的键错误?,python,argparse,Python,Argparse,我正试图编写一个程序,用于抓取图像,创建用于神经网络的数据集,但是我遇到了一些问题 代码如下: from imutils import paths import argparse import requests import cv2 import os ap = argparse.ArgumentParser() ap.add_argument("-u", "--C:/Users/artus/datasets/urls.txt", required=False

我正试图编写一个程序,用于抓取图像,创建用于神经网络的数据集,但是我遇到了一些问题

代码如下:

from imutils import paths
import argparse
import requests
import cv2
import os

ap = argparse.ArgumentParser()
ap.add_argument("-u", "--C:/Users/artus/datasets/urls.txt", 
                required=False, help="path containing URLs")
ap.add_argument("-o", "--C:/Users/artus/datasets/ShoesImage", 
                required=False, help="folder for downloaded images")
args = vars(ap.parse_args())

# grab the list of URLs from the input file, then initialize the
# total number of images downloaded thus far
rows = open(args["urls"]).read().strip().split("\n")
total = 0
执行时,它应该从URL.txt文件中指定的URL下载所有图像,但我遇到以下错误:

Traceback (most recent call last):
   File "C:/Users/artus/untitled5/imagescraping.py", line 16, in <module>
    rows = open(args["urls"]).read().strip().split("\n")
KeyError: 'urls'
回溯(最近一次呼叫最后一次):
文件“C:/Users/artus/untitled5/imagescraping.py”,第16行,在
行=打开(args[“url”]).read().strip().split(“\n”)
KeyError:“URL”

add_参数的第二个参数是该参数的“长名称”。对于第一个参数,您将传递
--url
,然后argparse将使用户传递的值作为
args[“url”]

然后,在命令行中,传入参数:

python imagescraping.py --urls C:/Users/artus/datasets/urls.txt

另外,我认为不需要将其包装在
vars

中。add_参数的第二个参数是参数的“长名称”。对于第一个参数,您将传递
--url
,然后argparse将使用户传递的值作为
args[“url”]

然后,在命令行中,传入参数:

python imagescraping.py --urls C:/Users/artus/datasets/urls.txt

另外,我认为在我将argparse代码复制粘贴到脚本时,不需要将其包装在
vars

中:

import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-u", "--C:/Users/artus/datasets/urls.txt", 
                required=False, help="path containing URLs")
ap.add_argument("-o", "--C:/Users/artus/datasets/ShoesImage", 
                required=False, help="folder for downloaded images")
args = ap.parse_args()
print(args)
不带任何论据地称之为:

0923:~/mypy$ python3 stack56745387.py 
Namespace(**{'C:/Users/artus/datasets/ShoesImage': None, 'C:/Users/artus/datasets/urls.txt': None})
寻求帮助:

1743:~/mypy$ python3 stack56745387.py -h
usage: stack56745387.py [-h] [-u C:/USERS/ARTUS/DATASETS/URLS.TXT]
                        [-o C:/USERS/ARTUS/DATASETS/SHOESIMAGE]

optional arguments:
  -h, --help            show this help message and exit
  -u C:/USERS/ARTUS/DATASETS/URLS.TXT, --C:/Users/artus/datasets/urls.txt C:/USERS/ARTUS/DATASETS/URLS.TXT
                        path containing URLs
  -o C:/USERS/ARTUS/DATASETS/SHOESIMAGE, --C:/Users/artus/datasets/ShoesImage C:/USERS/ARTUS/DATASETS/SHOESIMAGE
                        folder for downloaded images
您可能希望“-C:/Users/artus/datasets/url.txt”类似于默认值,但您将其定义为参数的长标志和
dest
。(设置中没有指定所需的
dest
或键作为
url
。)

您必须将其用作:

1750:~/mypy$ python3 stack56745387.py --C:/Users/artus/datasets/urls.txt foobar
Namespace(**{'C:/Users/artus/datasets/ShoesImage': None, 'C:/Users/artus/datasets/urls.txt': 'foobar'})
将代码更改为:

import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-u", "--urls", default="C:/Users/artus/datasets/urls.txt", 
                required=False, help="path containing URLs (default: %(default)s)")
ap.add_argument("-o", "--images",default="C:/Users/artus/datasets/ShoesImage", 
                required=False, help="folder for downloaded images (default: %(default)s)")
args = ap.parse_args()
print(args)

1802:~/mypy$ python3 stack56745387.py -h
usage: stack56745387.py [-h] [-u URLS] [-o IMAGES]

optional arguments:
  -h, --help            show this help message and exit
  -u URLS, --urls URLS  path containing URLs (default:
                        C:/Users/artus/datasets/urls.txt)
  -o IMAGES, --images IMAGES
                        folder for downloaded images (default:
                        C:/Users/artus/datasets/ShoesImage)
1803:~/mypy$ python3 stack56745387.py --urls foobar
Namespace(images='C:/Users/artus/datasets/ShoesImage', urls='foobar')

现在,当我将argparse代码复制粘贴到脚本时,您可以使用
args.url
vars(args)['url']

import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-u", "--C:/Users/artus/datasets/urls.txt", 
                required=False, help="path containing URLs")
ap.add_argument("-o", "--C:/Users/artus/datasets/ShoesImage", 
                required=False, help="folder for downloaded images")
args = ap.parse_args()
print(args)
不带任何论据地称之为:

0923:~/mypy$ python3 stack56745387.py 
Namespace(**{'C:/Users/artus/datasets/ShoesImage': None, 'C:/Users/artus/datasets/urls.txt': None})
寻求帮助:

1743:~/mypy$ python3 stack56745387.py -h
usage: stack56745387.py [-h] [-u C:/USERS/ARTUS/DATASETS/URLS.TXT]
                        [-o C:/USERS/ARTUS/DATASETS/SHOESIMAGE]

optional arguments:
  -h, --help            show this help message and exit
  -u C:/USERS/ARTUS/DATASETS/URLS.TXT, --C:/Users/artus/datasets/urls.txt C:/USERS/ARTUS/DATASETS/URLS.TXT
                        path containing URLs
  -o C:/USERS/ARTUS/DATASETS/SHOESIMAGE, --C:/Users/artus/datasets/ShoesImage C:/USERS/ARTUS/DATASETS/SHOESIMAGE
                        folder for downloaded images
您可能希望“-C:/Users/artus/datasets/url.txt”类似于默认值,但您将其定义为参数的长标志和
dest
。(设置中没有指定所需的
dest
或键作为
url
。)

您必须将其用作:

1750:~/mypy$ python3 stack56745387.py --C:/Users/artus/datasets/urls.txt foobar
Namespace(**{'C:/Users/artus/datasets/ShoesImage': None, 'C:/Users/artus/datasets/urls.txt': 'foobar'})
将代码更改为:

import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-u", "--urls", default="C:/Users/artus/datasets/urls.txt", 
                required=False, help="path containing URLs (default: %(default)s)")
ap.add_argument("-o", "--images",default="C:/Users/artus/datasets/ShoesImage", 
                required=False, help="folder for downloaded images (default: %(default)s)")
args = ap.parse_args()
print(args)

1802:~/mypy$ python3 stack56745387.py -h
usage: stack56745387.py [-h] [-u URLS] [-o IMAGES]

optional arguments:
  -h, --help            show this help message and exit
  -u URLS, --urls URLS  path containing URLs (default:
                        C:/Users/artus/datasets/urls.txt)
  -o IMAGES, --images IMAGES
                        folder for downloaded images (default:
                        C:/Users/artus/datasets/ShoesImage)
1803:~/mypy$ python3 stack56745387.py --urls foobar
Namespace(images='C:/Users/artus/datasets/ShoesImage', urls='foobar')

现在您可以使用
args.url
vars(args)['url']

这个特殊问题与网页抓取或下载图像无关-它只与您使用
argparse.ArgumentParser
有关。最好在
parse\u args()之后立即打印(args)
因此,您对解析器所做的工作有了清晰的了解。这个特定问题与web抓取或下载图像无关-它只与您使用
argparse.ArgumentParser
有关。最好在
parse\u args()之后立即打印(args)
因此,您对解析器所做的工作有了清晰的了解。代码现在可以工作了,但我不知道为什么现在会出现名称空间错误,这就是我尝试执行vars的原因,但似乎不起作用。你知道我可以把这个对象当作字典,然后用URL下载图片的其他方法吗?@arturo salmi:这是另一个问题,如果你不能理解,你应该发布一个新问题。至于一般问题的答案,请阅读代码现在可以工作了,但我不知道为什么我现在会出现名称空间错误,这就是为什么我尝试使用vars,但似乎不起作用。你知道我可以把这个对象当作字典,然后用URL下载图片的其他方法吗?@arturo salmi:这是另一个问题,如果你不能理解,你应该发布一个新问题。至于一般问题的答案,请阅读我在另一个答案中所说的,代码可以工作,但我得到了名称空间错误,因为args是一个对象而不是一个字典。有什么办法可以解决吗?我向您展示了从
parse_args
生成的
args
中获取“url”属性值的两种方法。正如我在另一个答案中所说的,代码是有效的,但我得到了名称空间错误,因为args是一个对象而不是一个字典。有什么办法可以解决吗?我向您展示了从
parse_args
生成的
args
获取“url”属性值的两种方法。