87

当我卷曲到 API 调用链接http://example.com/passkey=wedsmdjsjmdd

curl 'http://example.com/passkey=wedsmdjsjmdd'

我以 csv 文件格式获取员工输出数据,例如:

"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:

谢谢!

4

8 回答 8

123

使用 pandas 直接从 url 读取 csv 文件非常简单

import pandas as pd
data = pd.read_csv('https://example.com/passkey=wedsmdjsjmdd')

这将以表格格式读取您的数据,这将非常容易处理

于 2016-02-24T09:41:13.550 回答
86

您需要替换openurllib.urlopenurllib2.urlopen

例如

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 实现(只需要稍作改动),请参见下文

于 2013-04-29T16:42:42.840 回答
28

您也可以使用 requests 模块来做到这一点:

url = 'http://winterolympicsmedals.com/medals.csv'
r = requests.get(url)
text = r.iter_lines()
reader = csv.reader(text, delimiter=',')
于 2016-03-22T18:40:11.257 回答
27

为了在下载大文件时提高性能,以下可能会更有效地工作:

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   

通过stream=True在 GET 请求中设置,当我们传递r.iter_lines()给 csv.reader() 时,我们将生成器传递给 csv.reader()。通过这样做,我们使 csv.reader() 能够懒惰地迭代响应中的每一行for row in reader

这避免了在我们开始处理之前将整个文件加载到内存中,从而大大减少了大文件的内存开销。

于 2016-07-30T19:17:12.840 回答
22

此问题已标记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())'

(是的,它是三行,但您可以将其复制粘贴为一个命令。;)

于 2020-06-27T20:04:08.927 回答
8
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()

在此处输入图像描述

于 2019-06-25T01:19:46.453 回答
2

我也将这种方法用于 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)
于 2020-07-05T19:46:58.763 回答
0

您尝试使用 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



于 2019-11-23T12:36:30.070 回答