当前位置: 首页 > 知识库问答 >
问题:

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

锺功
2023-03-14

我正在读麦金尼的数据分析书,他共享了150MB文件。虽然这个主题已经在进度条上进行了广泛的讨论,而下载文件超文本传输协议与请求,我发现在接受的答案中的代码抛出一个错误。我是初学者,所以我无法解决这个问题。

我想下载以下文件:

https://raw.githubusercontent.com/wesm/pydata-book/2nd-edition/datasets/fec/P00000001-ALL.csv

以下是没有进度条的代码:

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)

这很有效,但是因为没有进度条,我想知道发生了什么。

下面是通过http下载带有请求的文件时从进度条改编的代码,以及如何使用python下载带有请求的大型文件。皮耶?

#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)

第二个选项(即流和tqdm包)有两个问题:

a) 文件大小计算不正确。实际大小为157MB,但总大小为25MB。

b) 比a)更大的问题是我得到了以下错误:

 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

作为初学者,我不确定如何解决这两个问题。我花了很多时间浏览TQM的git页面,但我没能理解它。我非常感谢你的帮助。

我假设读者知道我们需要导入请求tqdm。所以,我还没有包括导入这些基本包的代码。

这是给那些好奇的人的代码:

with open(local_filename, 'wb') as f:
    r = requests.get(url_with_filename, stream=True)  # added stream parameter
    # total_size = int(r.headers.get('content-length', 0))
    local_filename = DATA_PATH + '/' + filename
    total_size = len(r.content)
    downloaded = 0
    # chunk_size = max(1024*1024,int(total_size/1000))
    chunk_size = 1024
    #for chunk in tqdm(r.iter_content(chunk_size=chunk_size),total=total_size,unit='KB',unit_scale=True):
    for chunk in r.iter_content(chunk_size=chunk_size):
        downloaded += len(chunk)
        a=f.write(chunk)
        done = int(50 * downloaded/ total_size)
        sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50 - done)))
        sys.stdout.flush()

共有3个答案

公孙弘图
2023-03-14

试着用wb而不仅仅是w来写。

with open( local_filename, 'wb', encoding= r.encoding ) as f:
    f.write( r.text )
农弘毅
2023-03-14
with open(filename, 'wb', encoding=r.encoding) as f:
    f.write(r.content)

这会解决你的写作问题。写r.content不是r.text,因为类型(r.content)

姜玉泽
2023-03-14

正如错误所说:

write()参数必须是str,而不是bytes

因此,只需将块转换为字符串:

f.write(str(chunk))

注:相反,我建议写信给一位女士。bin文件,然后将其转换为。csv

 类似资料:
  • 运行上述代码后出现以下错误。请帮忙做这件事。。正在将源和目标文件名作为S3属性中的参数传递。。。 在处理上述异常时,发生了另一个异常: 回溯(最后一次调用):文件“C:\Cloudtail\CT\SQL Scripts\python\GRN\u S3\u dwnld.py”,第17行,除了botocore.exception.ClientErrors as e:NameError:未定义名称“bo

  • 我使用Dask读取2.5GB csv文件,Python给了我错误。这是我写的代码: 以下是我从Python得到的错误: dask_df=df1.read_csv('3SPACK_N150_7Ah_压力分布研究_Data_Matrix.csv')) 文件“C:\ProgramData\Anaconda3\lib\site packages\dask\dataframe\io\csv.py”,第645

  • 问题内容: 感谢使用此线程如何使用Java从Internet下载和保存文件? 我知道如何下载文件,现在的问题是我需要在我要下载的服务器上进行身份验证。这是Subversion服务器的http接口。我需要查询哪个领域? 使用最后一条评论中发布的代码,我得到了这个异常: 谢谢, 问题答案: 您扩展Authenticator类并进行注册。链接上的javadocs解释了如何。 我不知道这是否可以通过nio

  • 问题内容: 我正在尝试为我的网站完成一个相当简单的任务,但是我不确定该如何去做。我希望用户查看表格,然后单击一个按钮,此时用户可以保存该表的内容作为csv文件。此请求有时可能非常复杂,因此我生成了一个进度页来提醒用户。 除了实际生成csv文件之外,我已经弄清了大多数东西。(我使用jQuery和PHP) jQuery代码在单击时运行: 相关的PHP: 这样做是将文本作为PHP文件发送,但不会生成下载

  • 问题内容: http://www.example.com/information.asp我需要获取一个在线文件(例如),并将其保存到目录中。我知道有几种方法可以逐行捕获和读取在线文件(URL),但是有没有一种方法可以使用Java下载和保存文件? 问题答案: 可以使用 Java NIO : 使用是可能不是一个简单的循环从源信道的读取和写入这个频道有效得多。许多操作系统可以直接将字节从源通道传输到文件

  • 有一个联机文件(如)我需要抓取并保存到目录中。我知道有几种方法来抓取和读取在线文件(URL),逐行,但有没有一种方法只是下载和保存文件使用Java?