web-dev-qa-db-ja.com

URLからのPandas read_csv

私はPython 3.4とIPythonを使っていて、次のコードを持っています。与えられた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)

以下のエラーがあります

"ファイルパス名またはファイルのようなオブジェクトが期待されています。型を取得しました。"

どうすればこれを修正できますか?

87
venom

更新

パンダ0.19.2から、あなたはただ 直接URLを渡す することができます。


エラーが示唆するように、pandas.read_csvは最初の引数としてファイルのようなオブジェクトを必要とします。

文字列からcsvを読みたい場合は、 io.StringIO (Python 3.x)または StringIO.StringIO(Python 2.x) を使用できます。

また、URLの場合 - https://github.com/cs109/2014_data/blob/master/countries.csv - あなたは未処理のcsvではなくhtmlレスポンスを返しています。指定されたURLを使用してください。生のcsv応答を取得するためのgithubページのRawリンクによる - 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')))
109
Anand S Kumar

最新版のパンダ(0.19.2)では、直接URLを渡すことができます。

import pandas as pd

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

コメントしたように、リクエストを使用する場合はStringIOオブジェクトを使用してデコードする必要があります。つまり、c=pd.read_csv(io.StringIO(s.decode("utf-8")))は.contentが返すようにデコードする必要がありますbytess = requests.get(url).text c = pd.read_csv(StringIO(s))と同様。

より簡単な方法は、rawデータの正しいURLをread_csvに直接渡すことです、あなたはdo n'tオブジェクトのようなファイルを渡す必要があり、リクエストをまったく必要としないように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、およびfileが含まれます。ファイルURLの場合、ホストが必要です。たとえば、ローカルファイルはファイル://localhost/path/to/table.csvになります。

7

あなたが抱えている問題はあなたが変数 's'に入った出力がcsvではなくhtmlファイルであるということです。生のcsvを取得するには、URLを次のように修正する必要があります。

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

あなたの2番目の問題はread_csvがファイル名を期待するということです、我々はioモジュールからStringIOを使用することによってこれを解決することができます。 3つ目の問題は、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
4
PabTorre