首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复关闭文件异常的ValueError: read?

如何修复关闭文件异常的ValueError: read?
EN

Stack Overflow用户
提问于 2012-07-17 22:13:17
回答 2查看 20.6K关注 0票数 10

这个简单的Python3脚本:

代码语言:javascript
复制
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)

引发此例外情况:

代码语言:javascript
复制
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

我认为这可能是一个暂时的问题,所以我添加了一些简单的异常处理,如下所示:

代码语言:javascript
复制
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...

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-17 22:56:46

您的URL返回一个403代码错误,显然urllib.request.urlretrieve不擅长检测所有的urllib.request.FancyURLopener错误,因为它使用的是urllib.request.FancyURLopener,最近的一次尝试是通过返回urlinfo来吞咽错误,而不是引发错误。

关于修复,如果您仍然想使用urlretrieve检索,您可以像这样覆盖FancyURLopener (所包含的代码也显示错误):

代码语言:javascript
复制
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

代码语言:javascript
复制
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())
票数 6
EN

Stack Overflow用户

发布于 2020-01-21 14:19:12

如果您在托管云基础设施或托管安全服务上运行应用程序,请检查它们可能带来的限制。发生在我身上。云提供商有时会在可访问的站点上设置一个白名单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11531617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档