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


70

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

谢谢!


您可以直接访问该域吗?
brbcoding

1
您需要打开url并以大文本字符串形式读取它(请参阅urllib / requests),然后我假设您可以使用字符串而不是文件对象来初始化csv阅读器,但我不知道,我一直在将它与一个打开的文件句柄。
Joran Beasley

@brbcoding,是的。将链接放在浏览器上时,我可以获取csv文件。
mongotop 2013年

@JoranBeasley,我认为您的方法是正确的,也许我需要类似的内容,http://processing.org/reference/loadStrings_.html但使用python
mongotop 2013年

5
仅供参考:库(pandas.pydata.orgread_csv中的pandas函数接受URL。见pandas.pydata.org/pandas-docs/stable/generated/...
沃伦Weckesser

Answers:


82

您需要替换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实现(仅需要少量更改),请参见下文


1
您可以将其传递给csv_reader吗?我猜是这样……它非常类似于文件,但我从未做到过,甚至从未考虑过这样做
Joran Beasley

1
大声笑,我不知道我是对的,我只是问...以前从未见过这样做
Joran Beasley

我只是认为这是诚实的。我已经使用了一百次了,这太疯狂了。:D
eandersson

我认为urllib2.urlopen返回一个类似文件的对象,因此您可以删除.read(),然后传递responsecsv.reader
Dave Challis

1
@mongotop表示它正在工作...向您显示对象在内存中的位置。看起来它一次只能读取一行,所以也许cr.next()在循环内是您要查找的内容。(我自己还没有使用过csv阅读器...)
brbcoding

107

使用pandas可以直接从url中直接读取csv文件,这非常简单

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

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


1
这是我到目前为止遇到的最简单的方法之一!
Jawairia

2
只要您的CSV文件适合内存,就可以了。
JeffHeaton

4
没为我工作,也许我用光了记忆。pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 33, saw 2
Agustin Barrachina

无论如何有重试使用它,很多时候我得到500错误,当我再次read_csv时,它可以工作。当我从Google表格中阅读时,这种情况
经常

24

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

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

1
像魅力一样工作!感谢您提交答案!
mongotop

5
一个问题。reader变量是_csv.reader对象。当我遍历此对象以打印内容时,出现以下错误。错误:迭代器应返回字符串,而不是字节(您是否以文本模式打开文件?)。我如何读取csvreader对象的内容并说将其加载到熊猫数据框?
Harikrishna

1
@Harikrishna这可能是问题在Python 3这种情况下,在这里找到答案:stackoverflow.com/questions/18897029/...
米哈尔Skop

20

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

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=TrueGET请求,当我们传递r.iter_lines()给csv.reader()时,我们会将生成器传递给csv.reader()。这样,我们使csv.reader()可以在响应中的每一行上进行延迟迭代,for row in reader

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


1
这是一个很好的解决方案!谢谢@The Aelfinn!
mongotop '16

13
很好的解决方案,但我不得不也import codecs和包裹r.iter_lines()codecs.iterdecode()像这样:codecs.iterdecode(r.iterlines(), 'utf-8')......为了解决byteVSstr问题,unicode的解码问题和普遍的新的生产线的问题。
Irvin H.'Mar

我一直在寻找有这样要求的解决方案。
保存

8

该问题已加标签,python-2.x因此篡改原始问题或已接受的答案似乎不合适。但是,现在不支持Python 2,并且此问题对于“ python csv urllib”仍然具有良好的google功能,因此这里是更新的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())'

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


1
感谢@ThedudeAbides提供更新的解决方案!
mongotop

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

在此处输入图片说明


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




0

我还将这种方法用于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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.