[英]How to read a CSV file from a URL with Python?
當我執行 curl 到 API 呼叫鏈接http://example.com/passkey=wedsmdjsjmdd
curl 'http://example.com/passkey=wedsmdjsjmdd'
我以 csv 文件格式獲取員工 output 數據,例如:
"Steve","421","0","421","2","","","","","","","","","421","0","421","2"
如何使用 python 解析它。
我試過:
import csv
cr = csv.reader(open('http://example.com/passkey=wedsmdjsjmdd',"rb"))
for row in cr:
print row
但它沒有用,我得到了一個錯誤
http://example.com/passkey=wedsmdjsjmdd No such file or directory:
謝謝!
使用 pandas 直接從 url 讀取 csv 文件非常簡單
import pandas as pd
data = pd.read_csv('https://example.com/passkey=wedsmdjsjmdd')
這將以表格格式讀取您的數據,這將非常容易處理
您需要用urllib.urlopen或urllib2.urlopen替換open
。
例如
import csv
import urllib2
url = 'http://winterolympicsmedals.com/medals.csv'
response = urllib2.urlopen(url)
cr = csv.reader(response)
for row in cr:
print row
這將輸出以下內容
Year,City,Sport,Discipline,NOC,Event,Event gender,Medal
1924,Chamonix,Skating,Figure skating,AUT,individual,M,Silver
1924,Chamonix,Skating,Figure skating,AUT,individual,W,Gold
...
原始問題被標記為“python-2.x”,但對於 Python 3 實現(只需要很小的更改),請參見下文。
你也可以用 requests 模塊做到這一點:
url = 'http://winterolympicsmedals.com/medals.csv'
r = requests.get(url)
text = r.iter_lines()
reader = csv.reader(text, delimiter=',')
為了在下載大文件時提高性能,以下可能會更有效地工作:
import requests
from contextlib import closing
import csv
url = "http://download-and-process-csv-efficiently/python.csv"
with closing(requests.get(url, stream=True)) as r:
reader = csv.reader(r.iter_lines(), delimiter=',', quotechar='"')
for row in reader:
# Handle each row here...
print row
通過在 GET 請求中設置stream=True
,當我們將r.iter_lines()
傳遞給 csv.reader() 時,我們將一個生成器傳遞給 csv.reader()。 通過這樣做,我們使 csv.reader() 能夠使用for row in reader
懶惰地迭代響應中的每一行。
這避免了在我們開始處理之前將整個文件加載到內存中,從而大大減少了大文件的內存開銷。
這個問題被標記為python-2.x
因此篡改原始問題或已接受的答案似乎是不對的。 但是,現在不支持 Python 2,並且這個問題對於“python csv urllib”仍然有很好的谷歌果汁,所以這里有一個更新的 Python 3 解決方案。
現在需要將urlopen
的響應(以字節為單位)解碼為有效的本地編碼,因此必須稍微修改接受的答案:
import csv, urllib.request
url = 'http://winterolympicsmedals.com/medals.csv'
response = urllib.request.urlopen(url)
lines = [l.decode('utf-8') for l in response.readlines()]
cr = csv.reader(lines)
for row in cr:
print(row)
請注意以lines =
開頭的額外行,事實上urlopen
現在位於urllib.request
模塊中,並且print
當然需要括號。
它幾乎沒有廣告,但是是的, csv.reader
可以從字符串列表中讀取。
由於其他人提到了熊貓,這里有一個單行代碼,用於在控制台友好的輸出中顯示 CSV:
python3 -c 'import pandas
df = pandas.read_csv("http://winterolympicsmedals.com/medals.csv")
print(df.to_string())'
(是的,它是三行,但您可以將其復制粘貼為一個命令。;)
我也將這種方法用於 csv 文件(Python 3.6.9):
import csv
import io
import requests
r = requests.get(url)
buff = io.StringIO(r.text)
dr = csv.DictReader(buff)
for row in dr:
print(row)
您嘗試使用 curl 命令執行的是將文件下載到本地硬盤驅動器(HD)。 但是,您需要在 HD 上指定路徑
curl http://example.com/passkey=wedsmdjsjmdd -o ./example.csv
cr = csv.reader(open('./example.csv',"r"))
for row in cr:
print row
上述所有解決方案都不適用於 Python3,我收到了所有“著名”錯誤消息,如_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
和_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
. 所以我有點被困在這里。
我在這里的錯誤是,我使用了response.text
而response
是requests.models.Response
class,而我應該使用response.content
(如第一個錯誤建議的那樣),所以我能夠正確解碼它的 UTF-8 並拆分之后的行。 所以這是我的解決方案:
response = reqto.get("https://example.org/utf8-data.csv")
# Do some error checks to avoid bad results
if response.ok and len(response.content) > 0:
reader = csv.DictReader(response.content.decode('utf-8').splitlines(), dialect='unix')
for row in reader:
print(f"DEBUG: row={row}")
上面的示例已經為我提供了每一行的dict
。 但是每個字典鍵都有前導#
,我可能不得不忍受。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.