如何修复 ValueError: read of closed file 异常? [英] How do I fix a ValueError: read of closed file exception?
问题描述
这个简单的 Python 3 脚本:
import urllib.request
host = "scholar.google.com"
link = "/scholar.bib?q=info:K7uZdMSvdQ0J:scholar.google.com/&output=citation&hl=en&as_sdt=1,14&ct=citation&cd=0"
url = "http://" + host + link
filename = "cite0.bib"
print(url)
urllib.request.urlretrieve(url, filename)
引发此异常:
Traceback (most recent call last):
File "C:\Users\ricardo\Desktop\Google-Scholar\BibTex\test2.py", line 8, in <module>
urllib.request.urlretrieve(url, filename)
File "C:\Python32\lib\urllib\request.py", line 150, in urlretrieve
return _urlopener.retrieve(url, filename, reporthook, data)
File "C:\Python32\lib\urllib\request.py", line 1597, in retrieve
block = fp.read(bs)
ValueError: read of closed file
我认为这可能是一个临时问题,所以我添加了一些简单的异常处理,如下所示:
I thought this might be a temporary problem, so I added some simple exception handling like so:
import random
import time
import urllib.request
host = "scholar.google.com"
link = "/scholar.bib?q=info:K7uZdMSvdQ0J:scholar.google.com/&output=citation&hl=en&as_sdt=1,14&ct=citation&cd=0"
url = "http://" + host + link
filename = "cite0.bib"
print(url)
while True:
try:
print("Downloading...")
time.sleep(random.randint(0, 5))
urllib.request.urlretrieve(url, filename)
break
except ValueError:
pass
但这只是无限打印Downloading...
.
推荐答案
您的 URL 返回 403 代码错误并且显然 urllib.request.urlretrieve 并不擅长检测所有的 HTTP 错误,因为它使用的是 urllib.request.FancyURLopener
和这个最新的尝试通过返回一个 urlinfo
而不是引发错误.
Your URL return a 403 code error and apparently urllib.request.urlretrieve is not good at detecting all the HTTP errors, because it's using urllib.request.FancyURLopener
and this latest try to swallow error by returning an urlinfo
instead of raising an error.
关于修复,如果你仍然想使用 urlretrieve 你可以像这样覆盖 FancyURLopener(包含的代码也显示错误):
About the fix if you still want to use urlretrieve you can override FancyURLopener like this (code included to also show the error):
import urllib.request
from urllib.request import FancyURLopener
class FixFancyURLOpener(FancyURLopener):
def http_error_default(self, url, fp, errcode, errmsg, headers):
if errcode == 403:
raise ValueError("403")
return super(FixFancyURLOpener, self).http_error_default(
url, fp, errcode, errmsg, headers
)
# Monkey Patch
urllib.request.FancyURLopener = FixFancyURLOpener
url = "http://scholar.google.com/scholar.bib?q=info:K7uZdMSvdQ0J:scholar.google.com/&output=citation&hl=en&as_sdt=1,14&ct=citation&cd=0"
urllib.request.urlretrieve(url, "cite0.bib")
否则,这就是我推荐的你可以使用 urllib.request.urlopen
像这样:
Else and this is what i recommend you can use urllib.request.urlopen
like so:
fp = urllib.request.urlopen('http://scholar.google.com/scholar.bib?q=info:K7uZdMSvdQ0J:scholar.google.com/&output=citation&hl=en&as_sdt=1,14&ct=citation&cd=0')
with open("citi0.bib", "w") as fo:
fo.write(fp.read())
这篇关于如何修复 ValueError: read of closed file 异常?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!