簡體   English   中英

如何使用 Python 從 URL 讀取 CSV 文件?

[英]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.urlopenurllib2.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())'

(是的,它是三行,但您可以將其復制粘貼為一個命令。;)

import pandas as pd
url='https://raw.githubusercontent.com/juliencohensolal/BankMarketing/master/rawData/bank-additional-full.csv'
data = pd.read_csv(url,sep=";") # use sep="," for coma separation. 
data.describe()

在此處輸入圖片說明

我也將這種方法用於 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.textresponserequests.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM