【问题标题】:How to download a CSV file from the World Bank's dataset如何从世界银行的数据集中下载 CSV 文件
【发布时间】:2015-03-20 13:30:59
【问题描述】:

我想自动从世界银行的dataset 下载 CSV 文件。

我的问题是,与特定数据集对应的 URL 不会直接指向所需的 CSV 文件,而是对世界银行 API 的查询。例如,这是获取人均 GDP 数据的 URL:http://api.worldbank.org/v2/en/indicator/ny.gdp.pcap.cd?downloadformat=csv

如果您将此 URL 粘贴到浏览器中,它将自动开始下载相应文件。因此,我通常用于在 Python 中收集和保存 CSV 文件的代码在当前情况下无法正常工作:

baseUrl = "http://api.worldbank.org/v2/en/indicator/ny.gdp.pcap.cd?downloadformat=csv"
remoteCSV = urllib2.urlopen("%s" %(baseUrl))
myData = csv.reader(remoteCSV)

我应该如何修改我的代码以便将来自查询的文件下载到 API?

【问题讨论】:

  • 这个问题更有可能是数据被压缩了。您需要先解压缩它,然后才能使用它。
  • 哪些代码行可以实现这一点?
  • 您必须使用zipfile lib 从压缩包中提取数据。

标签: python csv download


【解决方案1】:

这将下载 zip,打开它并为您获取一个包含您想要的任何文件的 csv 对象。

import urllib2
import StringIO
from zipfile import ZipFile
import csv

baseUrl = "http://api.worldbank.org/v2/en/indicator/ny.gdp.pcap.cd?downloadformat=csv"
remoteCSV = urllib2.urlopen(baseUrl)

sio = StringIO.StringIO()
sio.write(remoteCSV.read())
    # We create a StringIO object so that we can work on the results of the request (a string) as though it is a file.

z = ZipFile(sio, 'r')
    # We now create a ZipFile object pointed to by 'z' and we can do a few things here:

print z.namelist()
    # A list with the names of all the files in the zip you just downloaded
    # We can use z.namelist()[1] to refer to 'ny.gdp.pcap.cd_Indicator_en_csv_v2.csv'

with z.open(z.namelist()[1]) as f:
# Opens the 2nd file in the zip
    csvr = csv.reader(f)
    for row in csvr:
        print row

有关详细信息,请参阅ZipFile DocsStringIO Docs

【讨论】:

  • 谢谢,它有效,解决了我的问题,我学到了一些关于 StringIO 库的新知识。
【解决方案2】:
import os
import urllib
import zipfile
from StringIO import StringIO

package = StringIO(urllib.urlopen("http://api.worldbank.org/v2/en/indicator/ny.gdp.pcap.cd?downloadformat=csv").read())
zip = zipfile.ZipFile(package, 'r')
pwd = os.path.abspath(os.curdir)

for filename in zip.namelist():
    csv = os.path.join(pwd, filename)
    with open(csv, 'w') as fp:
        fp.write(zip.read(filename))
    print filename, 'downloaded successfully'

从这里您可以使用您的方法来处理 CSV 文件。

【讨论】:

  • 谢谢,两个答案都很好,我将另一个标记为回答我的问题的那个,只是因为它有点“说教”。
【解决方案3】:

我们有一个脚本可以自动访问和提取世界银行世界发展指标的数据,例如:https://data.worldbank.org/indicator/GC.DOD.TOTL.GD.ZS

脚本执行以下操作:

  1. 下载元数据数据
  2. 提取元数据和数据
  3. 转换为Data Package

该脚本基于 python 并使用 python 3.0。它在标准库之外没有依赖项。试试看:

python scripts/get.py

python scripts/get.py https://data.worldbank.org/indicator/GC.DOD.TOTL.GD.ZS

您还可以阅读我们对世界银行数据的分析:

https://datahub.io/awesome/world-bank

【讨论】:

    【解决方案4】:

    只是建议而不是解决方案。您可以使用pd.read_csv 直接从 URL 读取任何 csv 文件。

    import pandas as pd
    data = pd.read_csv('http://url_to_the_csv_file')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多