私は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)
以下のエラーがあります
"ファイルパス名またはファイルのようなオブジェクトが期待されています。型を取得しました。"
どうすればこれを修正できますか?
パンダ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')))
最新版のパンダ(0.19.2
)では、直接URLを渡すことができます。
import pandas as pd
url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
c=pd.read_csv(url)
コメントしたように、リクエストを使用する場合は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になります。
あなたが抱えている問題はあなたが変数 '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