我有一个脚本想要继续使用,但是看起来我要么必须找到某种解决方法来解决Python 3中的错误,要么降级到2.6,因此还必须降级其他脚本…
希望这里有人已经设法找到解决方法。
问题在于,由于Python 3.0中有关字节和字符串的新更改,因此并非所有库代码都经过了明显的测试。
我有一个从Web服务器下载页面的脚本。该脚本在python 2.6中将用户名和密码作为url的一部分传递,但是在Python 3.0中,此操作不再起作用。
例如,这:
import urllib.request;
url = "http://username:password@server/file";
urllib.request.urlretrieve(url, "temp.dat");
失败,但出现以下异常:
Traceback (most recent call last):
File "C:\Temp\test.py", line 5, in <module>
urllib.request.urlretrieve(url, "test.html");
File "C:\Python30\lib\urllib\request.py", line 134, in urlretrieve
return _urlopener.retrieve(url, filename, reporthook, data)
File "C:\Python30\lib\urllib\request.py", line 1476, in retrieve
fp = self.open(url, data)
File "C:\Python30\lib\urllib\request.py", line 1444, in open
return getattr(self, name)(url)
File "C:\Python30\lib\urllib\request.py", line 1618, in open_http
return self._open_generic_http(http.client.HTTPConnection, url, data)
File "C:\Python30\lib\urllib\request.py", line 1576, in _open_generic_http
auth = base64.b64encode(user_passwd).strip()
File "C:\Python30\lib\base64.py", line 56, in b64encode
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str
显然,base64编码现在需要输入字节并输出一个字符串,因此urlretrieve(或其中的一些代码)会建立一个username:password字符串,并尝试对base64进行编码以进行简单授权,但失败了。
如果我改为尝试使用urlopen,如下所示:
import urllib.request;
url = "http://username:password@server/file";
f = urllib.request.urlopen(url);
contents = f.read();
然后失败,出现以下异常:
Traceback (most recent call last):
File "C:\Temp\test.py", line 5, in <module>
f = urllib.request.urlopen(url);
File "C:\Python30\lib\urllib\request.py", line 122, in urlopen
return _opener.open(url, data, timeout)
File "C:\Python30\lib\urllib\request.py", line 359, in open
response = self._open(req, data)
File "C:\Python30\lib\urllib\request.py", line 377, in _open
'_open', req)
File "C:\Python30\lib\urllib\request.py", line 337, in _call_chain
result = func(*args)
File "C:\Python30\lib\urllib\request.py", line 1082, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "C:\Python30\lib\urllib\request.py", line 1051, in do_open
h = http_class(host, timeout=req.timeout) # will parse host:port
File "C:\Python30\lib\http\client.py", line 620, in __init__
self._set_hostport(host, port)
File "C:\Python30\lib\http\client.py", line 632, in _set_hostport
raise InvalidURL("nonnumeric port: '%s'" % host[i+1:])
http.client.InvalidURL: nonnumeric port: 'password@server'
显然,此“下一代url检索库”中的url解析不知道如何处理url中的用户名和密码。
我还有其他选择吗?
直接来自Py3k文档:http
://docs.python.org/dev/py3k/library/urllib.request.html#examples
import urllib.request
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
uri='https://mahler:8092/site-updates.py',
user='klem',
passwd='kadidd!ehopper')
opener = urllib.request.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib.request.install_opener(opener)
urllib.request.urlopen('http://www.example.com/login.html')
我想实现一个SSIS作业,该作业能够下载位于远程Hadoop集群上的大型CSV文件。当然,在Hadoop系统上只有一个常规FTP服务器不会公开HDFS文件,因为它使用本地文件系统。 我想知道是否有一个FTP服务器实现位于HDFS之上。我更喜欢这种方法,而不是必须将文件从HDFS复制到本地FS,然后让FTP服务器提供服务,因为我需要分配更多的存储空间。
我已经尝试了。所有的失败都表明协议必须是HTTP或HTTPS。 Node有可用的FTP客户端(在npmjs上可用)。但是,根据他们的文档,他们需要创建一个到FTP服务器的连接,更改目录,然后下载它。 有什么简单的解决方法吗?
我知道在谷歌云存储中,你可以使用签名的URL,这是有时间限制的(还是不做真正的授权)。但是我在Firebase存储文档中没有看到任何关于的内容。我在关于Firebase存储的文章中看到过它,但从未直接在Firebase的文档中看到过。 据我所知,没有办法对访问Firebase存储文件进行真正的用户授权。请告诉我我错了。
问题内容: 我正在尝试使用命令行ftp客户端通过ftp文件夹,但是到目前为止,我只能使用’get’来获取单个文件。 问题答案: 您可以依靠通常可以正常处理ftp的wget(至少以我自己的经验)。例如: 您也可以使用适合镜像的。目前等同于。 如果凭据详细信息中包含一些特殊字符,则可以指定和参数以使其生效。具有特定字符的自定义登录的示例: 编辑 @asmaier指出,请注意,即使要进行递归,它的默认最
问题内容: 问题-设置Firefox配置文件后,Firefox在下载CSV文件时一直询问下载位置。请帮忙。 问题答案: 我看不到您的代码中的任何重大问题。但是,当你的等级不记得添加所有相关的CSV类型的文件在此提到的网站。 这是您自己的代码块,其中添加了一些简单的调整: 我已经在此站点和Microsoft 网站上验证了我的代码,并且在我看来效果很好。
我正在尝试下载大文件( 这是因为它在不使用太多内存的情况下下载文件,但它似乎不必要地无效,因为它不断尝试写入更多数据,而不知道是否有任何新数据到达。这似乎也通过我自己的测试得到了证实,同时在资源非常有限的VM上运行它,因为它似乎使用了更多的CPU,同时下载速度低于python中的类似脚本,并且使用是有原因的。 我想知道是否有一种方法可以让某些东西回调,如果x字节可用,或者它是文件的末尾,那么我就可