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

问题描述 投票:0回答:9

当我卷曲到 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:

谢谢!

python csv curl output python-2.x
9个回答
150
投票

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

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

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


92
投票

您需要将

open
替换为 urllib.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 实现(仅需要较小的更改)见下文


31
投票

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

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

31
投票

为了提高下载大文件时的性能,以下方法可能会更有效:

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
延迟迭代响应中的每一行。

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


30
投票

这个问题被标记为

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
可以从字符串列表中读取。

由于其他人提到了 pandas,这里有一个 pandas 再现,它在控制台友好的输出中显示 CSV:

python3 -c 'import pandas
df = pandas.read_csv("http://winterolympicsmedals.com/medals.csv")
print(df.to_string())'
不过,Pandas 并不是一个轻量级库。如果您不需要 pandas 提供的东西,或者启动时间很重要(例如,您正在编写命令行实用程序或任何其他需要快速加载的程序),我建议您坚持使用与标准库函数。

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



4
投票
上述所有解决方案都不适用于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?
。所以我有点被困在这里。

1
投票
我的错误是,我使用了

response.text

,而
response
是一个
requests.models.Response

类,而我应该使用

response.content

来代替(如第一个错误所建议的那样),所以我能够解码它的UTF-8正确并随后分割线。所以这是我的解决方案:
import csv
import reqto

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
 的背影。但是每个字典键都有前导 
#

,我可能不得不忍受。
    

您尝试使用curl命令执行的操作是将文件下载到本地硬盘(HD)。但是,您需要在高清上指定路径
curl http://example.com/passkey=wedsmdjsjmdd -o ./example.csv

cr = csv.reader(open('./example.csv',"r")) for row in cr: print row

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.