使用Python从Internet下载大型CSV文件的进度

时间:2018-10-12 07:03:42

标签: python python-3.x csv python-requests

我正在阅读麦金尼的数据分析书,他已经共享了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 RequestsHow 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页面,但无法跟踪。我将不胜感激。


我假设读者知道我们需要导入tqdmrequests。因此,我没有包含用于导入这些基本软件包的代码。


  

以下是好奇者的代码:

tqdm

3 个答案:

答案 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'>,因此您需要在文件中写入