URLからパンダread_csv


138

IPythonでPython 3.4を使用しており、次のコードがあります。指定された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)

次のエラーがあります

「予期されるファイルパス名またはファイルのようなオブジェクト、タイプを取得しました」

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


次のようなものc=pd.read_csv(io.StringIO(s.decode("utf-8")))が必要になりますが、csvファイルではなくhtmlが返されるため、機能しません
Padraic Cunningham

3
ご希望のURLは間違いありません"https://raw.github.com/cs109/2014_data/blob/master/countries.csv"
kylie.a

@venom、より人気のある答えを正しいものとして選択
ibodi

回答:


166

更新

パンダから、直接URLを渡す0.19.2ことができるようになりました


エラーが示す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-html生のcsvではなく応答が返さRawれます。githubページのリンクで指定された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')))

応答が大きく、エンコードされたコンテンツ、デコードされたコンテンツ、およびStringIOオブジェクトのメモリを消費する代わりに、応答をストリーミングしたい場合はどうなりますか?
akaihola

9
最新バージョンのパンダでは、URLを直接指定できますc=pd.read_csv(url)
inodb

不思議なことに、私はpandas(0.23.4)の新しいバージョンを持っていますが、URLを直接指定することができませんでした。この答えは私がそれを機能させるのに役立ちました。
アンティ、

1
「Pandas 0.19.2からのアップデートでは、URLを直接渡すことができるようになりました。」認証引数を渡す必要があるためにできない場合を除き、その場合、元の例が非常に必要です。
アーロンホール

この解決策は、リクエストオブジェクトによって返される可能性のあるHTTPコードを使用したより良いエラー処理が必要な場合(例:
500-

235

最新バージョンのパンダ(0.19.2)では、URLを直接渡すことができます

import pandas as pd

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

リクエストの代わりにこれを直接使用すると、使用してもリクエストキャッシュが使用されないようです
shadi

5
そのコードはurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>、urllibが処理できないhttpsプロトコルのために戻ります。
multigoodverse

Python 2を使用している場合は、Python 2.7.10以降を使用する必要があります。
avelis 2018年

URLからのcsvの読み取りに問題があるようです。ローカルストレージから1回、URLから1回ファイルを読み取りましたが、URLからエラーが発生し続けました。次に、error_bad_lines = Falseを有効にし、データの99%以上が無視されました。URLはlinkです。ファイルを読み取ると、データセットの形状は(88,1)であることがわかりましたが、これは完全に間違っています
Rishik Mani

10

私はコメントとして、あなたはStringIOオブジェクトとを使用する必要がデコードすなわちc=pd.read_csv(io.StringIO(s.decode("utf-8"))).content戻ったとして、あなたがデコードに必要な要求を使用している場合バイトあなただけであるとしてSを渡す必要があるでしょう.TEXTあなたが使用している場合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
..................................

ドキュメントから :

filepath_or_buffer

文字列またはファイルハンドル/ StringIO文字列はURLである可能性があります。有効なURLスキームには、http、ftp、s3、およびfileが含まれます。ファイルURLの場合、ホストが必要です。たとえば、ローカルファイルは://localhost/path/to/table.csvのようになります。


1
あなたはパンダread_csvに直接URLを送ることができます!もちろん!それは私が見つけたものよりもはるかに簡単な解決策です!:D
PabTorre

1
@pabtorre、うん、ドキュメントを読むのが良い考えの例。
Padraic Cunningham 2015

6

あなたが持っている問題は、変数「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


0

パンダの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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.