Python urllib keyerror
Python Urllib keyerror
我想计算来自特定 url
的所有单词
import urllib.request
url = 'http://www.py4inf.com/code/romeo.txt'
fhand = urllib.request.Request(url)
resp = urllib.request.urlopen(fhand)
counts = dict()
for line in resp:
words = line.split()
print (words)
for word in words:
counts[word] = counts[word] +1
print (counts)
我在 运行 执行此操作时遇到错误:
[b'But', b'soft', b'what', b'light', b'through', b'yonder', b'window', b'breaks']
回溯(最后一次调用):
文件 "C:/Python/Hello/Exercise.py",第 13 行,位于
计数[字] = 计数[字] +1
KeyError: b'But'
为什么每个单词或每一行都附加 b'?如果我使用相同的代码从文件中读取,它工作正常。
当它还不存在时,您正在尝试添加它。例如。
counts = {}
counts["test"] = counts["test"] + 1 # counts["test"] does not exist...
因为 "test"
还没有在 counts
中,它会引发一个 KeyError。
简单的解决办法是检查它是否在里面。如果不是,则将其分配给 1:
import urllib.request
url = 'http://www.py4inf.com/code/romeo.txt'
fhand = urllib.request.Request(url)
resp = urllib.request.urlopen(fhand)
counts = dict()
for line in resp:
words = line.split()
print (words)
for word in words:
counts[word] = counts[word]+1 if word in counts else 1
print (counts)
我知道了。
虽然我声明为字典,但我正在添加为列表。
对于字典,我试过了
计数[字] = counts.get(字,0) +1
成功了。
好像每天都有一道题的答案是defaultdict
.
import urllib.request
from collections import defaultdict
url = 'http://www.py4inf.com/code/romeo.txt'
fhand = urllib.request.Request(url)
resp = urllib.request.urlopen(fhand)
counts = defaultdict(int) # pass a default type in, int() == 0
for line in resp:
words = line.split()
print (words)
for word in words:
counts[word] = counts[word] +1
print (counts)
使用常规字典时,count[word]
尚未定义,将抛出 KeyError
。 defaultdict
的简单实现可能类似于:
class defaultdict(dict):
def __init__(self, default_type, *args, **kwargs):
# this allows for the regular dictionary constructor to be used
dict.__init__(self, *args, **kwargs)
self._type = default_type
def __getitem__(self, key):
try:
return dict.__getitem__(self, key)
except KeyError:
dict.__setitem__(self, key, self._type())
return dict.__getitem__(self, key)
我确信有更好的方法可以做到这一点,但它的工作方式应该大致相同。 __setitem__
的默认实现将隐式引用 __getitem__
.
的新定义
我想计算来自特定 url
的所有单词import urllib.request
url = 'http://www.py4inf.com/code/romeo.txt'
fhand = urllib.request.Request(url)
resp = urllib.request.urlopen(fhand)
counts = dict()
for line in resp:
words = line.split()
print (words)
for word in words:
counts[word] = counts[word] +1
print (counts)
我在 运行 执行此操作时遇到错误: [b'But', b'soft', b'what', b'light', b'through', b'yonder', b'window', b'breaks']
回溯(最后一次调用): 文件 "C:/Python/Hello/Exercise.py",第 13 行,位于 计数[字] = 计数[字] +1
KeyError: b'But'
为什么每个单词或每一行都附加 b'?如果我使用相同的代码从文件中读取,它工作正常。
当它还不存在时,您正在尝试添加它。例如。
counts = {}
counts["test"] = counts["test"] + 1 # counts["test"] does not exist...
因为 "test"
还没有在 counts
中,它会引发一个 KeyError。
简单的解决办法是检查它是否在里面。如果不是,则将其分配给 1:
import urllib.request
url = 'http://www.py4inf.com/code/romeo.txt'
fhand = urllib.request.Request(url)
resp = urllib.request.urlopen(fhand)
counts = dict()
for line in resp:
words = line.split()
print (words)
for word in words:
counts[word] = counts[word]+1 if word in counts else 1
print (counts)
我知道了。 虽然我声明为字典,但我正在添加为列表。
对于字典,我试过了
计数[字] = counts.get(字,0) +1
成功了。
好像每天都有一道题的答案是defaultdict
.
import urllib.request
from collections import defaultdict
url = 'http://www.py4inf.com/code/romeo.txt'
fhand = urllib.request.Request(url)
resp = urllib.request.urlopen(fhand)
counts = defaultdict(int) # pass a default type in, int() == 0
for line in resp:
words = line.split()
print (words)
for word in words:
counts[word] = counts[word] +1
print (counts)
使用常规字典时,count[word]
尚未定义,将抛出 KeyError
。 defaultdict
的简单实现可能类似于:
class defaultdict(dict):
def __init__(self, default_type, *args, **kwargs):
# this allows for the regular dictionary constructor to be used
dict.__init__(self, *args, **kwargs)
self._type = default_type
def __getitem__(self, key):
try:
return dict.__getitem__(self, key)
except KeyError:
dict.__setitem__(self, key, self._type())
return dict.__getitem__(self, key)
我确信有更好的方法可以做到这一点,但它的工作方式应该大致相同。 __setitem__
的默认实现将隐式引用 __getitem__
.