【问题标题】:Pandas read_csv from url熊猫从网址读取_csv
【发布时间】:2015-11-30 18:40:30
【问题描述】:

我正在尝试使用 Python 3.x 从给定 URL 读取 csv 文件:

import pandas as pd
import requests

url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
s = requests.get(url).content
c = pd.read_csv(s)

我有以下错误

"预期的文件路径名或类文件对象,得到 类型"

我该如何解决这个问题?我正在使用 Python 3.4

【问题讨论】:

  • 你需要像c=pd.read_csv(io.StringIO(s.decode("utf-8"))) 这样的东西,但你得到的不是 csv 文件,而是 html,所以它不会工作
  • 我很确定你想要的网址是"https://raw.github.com/cs109/2014_data/blob/master/countries.csv"
  • @venom,选择更受欢迎的答案作为正确的答案
  • Sicne 问题出在pandas.read_csv() 而不是 Python,您也应该说明 pandas 版本,但给定了Python 3.4 was released in 2014,所以您可能正在运行pandas 0.12 .. 0.15
  • 从 Pandas 1.2 开始用于基本 HTTP 身份验证:stackoverflow.com/a/68307497/940098

标签: python csv pandas request


【解决方案1】:

在最新版的pandas(0.19.2)可以直接传url

import pandas as pd

url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
c=pd.read_csv(url)

【讨论】:

  • 看来直接使用this而不是直接使用requests 不使用requests-cache即使使用了
  • 由于 urllib 无法处理的 https 协议,该代码返回 urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>
  • 对于使用 Python 2 的用户,您必须使用 Python 2.7.10+。
  • 从 URL 读取 csv 似乎有些问题。我从本地存储读取文件一次,从 URL 读取一次,我不断收到来自 URL 的错误。然后我启用了 error_bad_lines=False 并且超过 99% 的数据被忽略了。 URL 是link。一读文件,发现数据集的形状是(88,1),完全错误
  • 好像不太好用,遇到urlopen错误问题:<urlopen error [Errno 11004] getaddrinfo failed>
【解决方案2】:

更新:从 pandas 0.19.2 您现在可以只使用 pass read_csv() the url directly,但如果需要身份验证,这将失败。


对于较旧的 pandas 版本,或如果您需要身份验证,或出于任何其他 HTTP 容错原因:

pandas.read_csv 与类似文件的对象一起用作第一个参数。

  • 如果要从字符串中读取 csv,可以使用io.StringIO

  • 对于 URL https://github.com/cs109/2014_data/blob/master/countries.csv,您会得到 html 响应,而不是 raw csv;您应该使用 github 页面中 Raw 链接给出的 url 来获取原始 csv 响应,即 https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv

例子:

import pandas as pd
import io
import requests
url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
s=requests.get(url).content
c=pd.read_csv(io.StringIO(s.decode('utf-8')))

注意事项:

在 Python 2.x 中,字符串缓冲区对象为 StringIO.StringIO

【讨论】:

  • 如果响应很大并且我想将其流式传输而不是为编码内容、解码内容和 StringIO 对象消耗内存怎么办?
  • 在最新版本的熊猫中,您可以直接提供网址,即c=pd.read_csv(url)
  • 奇怪的是我有一个更新版本的pandas (0.23.4),但我不能直接给出 url。这个答案帮助我完成了这项工作。
  • "从 pandas 0.19.2 更新,您现在可以直接传递 url。"除非你不能因为你需要传递身份验证参数,在这种情况下非常需要原始示例。
  • 如果您需要使用请求对象可能返回的 HTTP 代码更好地处理错误(例如:500 -> 可能需要重试,404 -> 不重试),此解决方案仍然很有价值
【解决方案3】:

正如我所评论的,您需要使用 StringIO 对象并解码,即 c=pd.read_csv(io.StringIO(s.decode("utf-8"))) 如果使用请求,则需要解码为 .content 返回 bytes 如果您使用 .text 您只需要传递s 原样 s = requests.get(url).text c = pd.read_csv(StringIO(s))

更简单的方法是将原始数据的正确url直接传递给read_csv,你不必传递一个像对象这样的文件,你可以传递一个 url,所以你根本不需要请求:

c = pd.read_csv("https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv")

print(c)

输出:

                              Country         Region
0                             Algeria         AFRICA
1                              Angola         AFRICA
2                               Benin         AFRICA
3                            Botswana         AFRICA
4                             Burkina         AFRICA
5                             Burundi         AFRICA
6                            Cameroon         AFRICA
..................................

来自docs

filepath_or_buffer

字符串或文件句柄/StringIO 该字符串可以是一个 URL。有效的 URL 方案包括 http、ftp、s3 和文件。对于文件 URL,需要一个主机。例如,本地文件可以是文件://localhost/path/to/table.csv

【讨论】:

  • 您可以直接将 url 提供给 pandas read_csv!当然!这比我找到的解决方案简单得多! :D
  • @pabtorre,是的,阅读文档是个好主意的一个例子。
  • 这行得通,但就我而言,我需要设置函数pd.read_csv 的参数sep,例如:pd.read_csv(StringIO(s), sep='\t')。如果我使用默认设置 sep=None ,它会引发错误Error tokenizing data. C error: Expected 1 fields in line 6, saw 5
  • 为什么我仍然只得到这个 url 的一列? ebi.ac.uk/Tools/services/rest/clustalo/result/…
【解决方案4】:

您遇到的问题是您进入变量“s”的输出不是 csv,而是 html 文件。 为了获取原始 csv,您必须将 url 修改为:

'https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv'

您的第二个问题是 read_csv 需要一个文件名,我们可以通过使用 io 模块中的 StringIO 来解决这个问题。 第三个问题是 request.get(url).content 传递一个字节流,我们可以使用 request.get(url).text 来解决这个问题。

最终结果是这段代码:

from io import StringIO

import pandas as pd
import requests
url='https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv'
s=requests.get(url).text

c=pd.read_csv(StringIO(s))

输出:

>>> c.head()
    Country  Region
0   Algeria  AFRICA
1    Angola  AFRICA
2     Benin  AFRICA
3  Botswana  AFRICA
4   Burkina  AFRICA

【讨论】:

    【解决方案5】:
    url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
    c = pd.read_csv(url, sep = "\t")
    

    【讨论】:

    • 请解释您的解决方案是如何工作的。
    • 这可能会引发一个url错误:urlopen error [Errno 11004] getaddrinfo failed
    【解决方案6】:

    要在 pandas 中通过 URL 导入数据,只需应用下面的简单代码,它实际上效果更好。

    import pandas as pd
    train = pd.read_table("https://urlandfile.com/dataset.csv")
    train.head()
    

    如果您对原始数据有疑问,只需在 URL 前加上 'r'

    import pandas as pd
    train = pd.read_table(r"https://urlandfile.com/dataset.csv")
    train.head()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-30
      • 2021-05-16
      • 2021-12-02
      • 2021-05-27
      • 2019-10-09
      • 2013-04-16
      • 1970-01-01
      • 2019-04-30
      相关资源
      最近更新 更多