curl 如何用Python从URL读取CSV文件?

ejk8hzay  于 2022-11-13  发布在  Python
关注(0)|答案(8)|浏览(135)

当我对一个API调用链接http://example.com/passkey=wedsmdjsjmdd执行curl时

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:
谢谢你!

zfycwa2u

zfycwa2u1#

使用panda,直接从url读取csv文件非常简单。

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

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

ukxgm1gy

ukxgm1gy2#

您需要将open替换为urllib.urlopen或urllib2.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实现(只需要很小的修改)see below

jei2mxaa

jei2mxaa3#

您也可以使用requests模块来完成此操作:

url = 'http://winterolympicsmedals.com/medals.csv'
r = requests.get(url)
text = r.iter_lines()
reader = csv.reader(text, delimiter=',')
fkaflof6

fkaflof64#

要在下载大文件时提高性能,以下方法可能会更有效一些:

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()时,我们将一个generator传递给csv.reader()。这样,我们就可以使csv.reader()使用for row in reader在响应中的每一行进行惰性迭代。
这避免了在我们开始处理之前将整个文件加载到内存中,从而大大减少了大文件的内存开销。

o7jaxewo

o7jaxewo5#

这个问题的标签是python-2.x,所以修改原来的问题,或者说被接受的答案似乎是不对的。然而,Python 2现在不被支持了,这个问题仍然有很好的google juice“python csv urllib”,所以这里有一个更新的Python 3解决方案。
现在需要将urlopen的响应(以字节为单位)解码为有效的本地编码,因此accepted answer必须稍微修改一下:

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 * 可以 * 从一个字符串列表中读取。
由于其他人提到了Pandas,这里有一个Pandas再现,它在一个控制台友好的输出中显示CSV:

python3 -c 'import pandas
df = pandas.read_csv("http://winterolympicsmedals.com/medals.csv")
print(df.to_string())'

不过,Pandas并不是一个轻量级的库。如果你不需要Pandas提供的功能,或者启动时间很重要(例如,你正在编写一个命令行实用程序或其他需要快速加载的程序),我建议你坚持使用标准的库函数。

iszxjhcz

iszxjhcz6#

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()

mnowg1ta

mnowg1ta7#

对于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)
os8fio9y

os8fio9y8#

你试图用curl命令做的是把文件下载到你的本地硬盘驱动器(HD)。2但是你需要在HD上指定一个路径

curl http://example.com/passkey=wedsmdjsjmdd -o ./example.csv
cr = csv.reader(open('./example.csv',"r"))
for row in cr:
    print row

相关问题