Pandas read_csv จาก url


147

ฉันใช้ Python 3.4 กับ IPython และมีรหัสต่อไปนี้ ฉันไม่สามารถอ่านไฟล์ csv จาก URL ที่ระบุ:

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")))แต่คุณได้รับ html กลับไม่ใช่ไฟล์ csv ดังนั้นมันจะไม่ทำงาน
Padraic Cunningham

4
ผมค่อนข้างมั่นใจ URL "https://raw.github.com/cs109/2014_data/blob/master/countries.csv"ที่คุณต้องการเป็น
kylieCatt

@venom เลือกคำตอบที่ได้รับความนิยมมากขึ้นเป็นคำตอบที่ถูกต้อง
ibodi

คำตอบ:


178

อัปเดต

จากหมีแพนด้า0.19.2ตอนนี้คุณสามารถเพียงแค่ผ่าน URL โดยตรง


เช่นเดียวกับข้อผิดพลาดที่แนะนำpandas.read_csvต้องมีวัตถุคล้ายไฟล์เป็นอาร์กิวเมนต์แรก

หากคุณต้องการที่จะอ่าน CSV จากสตริงคุณสามารถใช้io.StringIO(Python 3.x) หรือStringIO.StringIO(หลาม 2.x)

นอกจากนี้สำหรับ URL - https://github.com/cs109/2014_data/blob/master/countries.csv - คุณได้รับการhtmlตอบกลับไม่ใช่ csv ดิบคุณควรใช้ url ที่Rawลิงก์ในหน้า github ให้มา รับการตอบสนองดิบ 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

11
ในเวอร์ชันล่าสุดของแพนด้าคุณสามารถให้ url ได้โดยตรงเช่นc=pd.read_csv(url)
inodb

อยากรู้อยากเห็นฉันมีpandas(0.23.4) เวอร์ชันใหม่กว่าแต่ไม่สามารถให้ url ได้โดยตรง คำตอบนี้ช่วยให้ฉันทำงานได้ดี
Antti

2
"อัปเดตจากแพนด้า 0.19.2 ตอนนี้คุณสามารถส่ง url ได้โดยตรง" เว้นแต่คุณจะทำไม่ได้เพราะคุณต้องส่งผ่านอาร์กิวเมนต์การพิสูจน์ตัวตนซึ่งในกรณีนี้ตัวอย่างดั้งเดิมนั้นจำเป็นมาก
Aaron Hall

โซลูชันนี้ยังคงมีประโยชน์หากคุณต้องการการจัดการข้อผิดพลาดที่ดีขึ้นโดยใช้รหัส HTTP ที่อาจส่งคืนโดยออบเจ็กต์คำขอ (เช่น 500 -> อาจจำเป็นต้องลองใหม่ 404 -> ไม่ต้องลองใหม่)
JulienV

246

ในเวอร์ชันล่าสุดของแพนด้า ( 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)>เนื่องจากโปรโตคอล https ซึ่ง urllib ไม่สามารถจัดการได้
multigoodverse

สำหรับผู้ที่ใช้ Python 2 คุณจะต้องใช้ Python 2.7.10+
avelis

ดูเหมือนจะมีปัญหาในการอ่าน csv จาก URL ฉันอ่านไฟล์หนึ่งครั้งจากที่จัดเก็บในตัวเครื่องและอีกครั้งจาก URL ฉันได้รับข้อผิดพลาดจาก URL จากนั้นฉันก็เปิดใช้ error_bad_lines = False และข้อมูลมากกว่า 99% ถูกละเว้น URL คือการเชื่อมโยง เมื่อฉันอ่านไฟล์รูปร่างของชุดข้อมูลพบว่าเป็น (88,1) ซึ่งผิดอย่างสิ้นเชิง
Rishik Mani

ดูเหมือนว่าจะทำงานได้ไม่ดีฉันมีปัญหาเกี่ยวกับข้อผิดพลาด urlopen:<urlopen error [Errno 11004] getaddrinfo failed>
ShinNShirley

11

ขณะที่ผมแสดงความคิดเห็นที่คุณจำเป็นต้องใช้วัตถุ StringIO และถอดรหัสเช่นc=pd.read_csv(io.StringIO(s.decode("utf-8")))ถ้าใช้การร้องขอคุณจะต้องถอดรหัสผลตอบแทน .content ไบต์ถ้าคุณใช้ .Text คุณก็จะต้องผ่าน s เป็นs = requests.get(url).textc pd.read_csv(StringIO(s))=

วิธีที่ง่ายกว่าคือการส่ง url ที่ถูกต้องของข้อมูลดิบไปยังโดยตรงread_csvคุณไม่ต้องส่งไฟล์เช่น object คุณสามารถส่ง 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 :

string หรือ file handle / StringIO สตริงอาจเป็น URL รูปแบบ URL ที่ถูกต้อง ได้แก่ http, ftp, s3 และไฟล์ สำหรับ URL ของไฟล์ควรมีโฮสต์ ตัวอย่างเช่นไฟล์ในเครื่องอาจเป็นไฟล์: //localhost/path/to/table.csv


1
คุณสามารถป้อน url ให้แพนด้าได้โดยตรง read_csv! แน่นอน! นั่นเป็นวิธีแก้ปัญหาที่ง่ายกว่าที่ฉันพบ! : D
PabTorre

1
@pabtorre ใช่ตัวอย่างว่าทำไมการอ่านเอกสารจึงเป็นความคิดที่ดี
Padraic Cunningham

ซึ่งได้ผลในกรณีของฉันฉันต้องตั้งค่าพารามิเตอร์sepของฟังก์ชันpd.read_csvเช่น: pd.read_csv(StringIO(s), sep='\t'). หากฉันใช้การตั้งค่าเริ่มต้นsep=Noneจะทำให้เกิดข้อผิดพลาดError tokenizing data. C error: Expected 1 fields in line 6, saw 5
ShinNShirley

เหตุใดฉันจึงยังได้รับเพียงคอลัมน์เดียวสำหรับ URL นี้ ebi.ac.uk/Tools/services/rest/clustalo/result/…
webNoob13

9

ปัญหาที่คุณพบคือผลลัพธ์ที่คุณได้รับในตัวแปรไม่ใช่ไฟล์ csv แต่เป็นไฟล์ html ในการรับ csv ดิบคุณต้องแก้ไข url เป็น:

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

ปัญหาที่สองของคุณคือ read_csv ต้องการชื่อไฟล์เราสามารถแก้ปัญหานี้ได้โดยใช้ StringIO จากโมดูล io ปัญหาที่สามคือ request.get (url) เนื้อหาส่งกระแสข้อมูลไบต์เราสามารถแก้ปัญหานี้ได้โดยใช้ 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

2
url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
c = pd.read_csv(url, sep = "\t")

โปรดให้คำอธิบายว่าโซลูชันของคุณทำงานอย่างไร
Selim Yildiz

สิ่งนี้อาจทำให้เกิดข้อผิดพลาด url:urlopen error [Errno 11004] getaddrinfo failed
ShinNShirley

0

ในการนำเข้าข้อมูลผ่าน URL ในแพนด้าเพียงแค่ใช้โค้ดด้านล่างง่ายๆก็จะทำงานได้ดีขึ้น

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

หากคุณกำลังมีปัญหากับข้อมูลดิบให้ใส่ 'r' ก่อน URL

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.