我正在阅读麦金尼的数据分析书,他已经共享了150MB的文件。尽管在Progress Bar while download file over http with Requests上对该主题进行了广泛的讨论,但我发现可接受的答案中的代码引发错误。我是初学者,所以我无法解决此问题。
我要下载以下文件:
resetStyle
这是没有进度条的代码:
https://raw.githubusercontent.com/wesm/pydata-book/2nd-edition/datasets/fec/P00000001-ALL.csv
这很好用,但是因为没有进度条,所以我想知道发生了什么事。
以下是从Progress Bar while download file over http with Requests和How to download large file in python with requests.py?改编而成的代码
DATA_PATH='./Data'
filename = "P00000001-ALL.csv"
url_without_filename = "https://raw.githubusercontent.com/wesm/pydata-book/2nd-edition/datasets/fec"
url_with_filename = url_without_filename + "/" + filename
local_filename = DATA_PATH + '/' + filename
#Write the file on local disk
r = requests.get(url_with_filename) #without streaming
with open(local_filename, 'w', encoding=r.encoding) as f:
f.write(r.text)
第二个选项(即流媒体和#Option 2:
#Write the file on local disk
r = requests.get(url_with_filename, stream=True) # added stream parameter
total_size = int(r.headers.get('content-length', 0))
with open(local_filename, 'w', encoding=r.encoding) as f:
#f.write(r.text)
for chunk in tqdm(r.iter_content(1024), total=total_size, unit='B', unit_scale=True):
if chunk:
f.write(chunk)
包)存在两个问题:
a)文件大小计算不正确。实际大小为157MB,但tqdm
却是25MB。
b)比a)更大的问题是出现以下错误:
total_size
作为一个初学者,我不确定如何解决这两个问题。我花了很多时间浏览 0%| | 0.00/24.6M [00:00<?, ?B/s] Traceback (most recent call last): File "C:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3265, in run_code
exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-31-abbe9270092b>", line 6, in <module>
f.write(data) TypeError: write() argument must be str, not bytes
的git页面,但无法跟踪。我将不胜感激。
我假设读者知道我们需要导入tqdm
和requests
。因此,我没有包含用于导入这些基本软件包的代码。
以下是好奇者的代码:
tqdm
答案 0 :(得分:1)
如错误所示:
write()参数必须为str,而不是字节
所以只需将 chunk 转换为 string 即可:
f.write(str(chunk))
注意:相反,我建议写一个 .bin 文件,然后将其转换为 .csv
答案 1 :(得分:0)
尝试使用wb
而不是w
进行书写。
with open( local_filename, 'wb', encoding= r.encoding ) as f:
f.write( r.text )
答案 2 :(得分:0)
with open(filename, 'wb', encoding=r.encoding) as f:
f.write(r.content)
这应该可以解决您的书写问题。写r.content
而不写r.text
由于type(r.content)
是<class 'bytes'>
,因此您需要在文件中写入