【问题标题】:How to read a CSV file from a URL with Python?如何使用 Python 从 URL 读取 CSV 文件?
【发布时间】:2013-04-23 10:09:43
【问题描述】:

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

谢谢!

【问题讨论】:

  • 你能直接访问那个域吗?
  • 您需要打开 url 并将其作为大文本字符串读入(请参阅 urllib/requests),然后我假设您可以使用字符串而不是文件对象初始化 csv 阅读器,但我不知道,我一直用打开的文件句柄。
  • @brbcoding,是的。当我将链接放在浏览器上时,我可以得到 csv 文件。
  • @JoranBeasley,我认为你的方法是正确的,也许我需要类似http://processing.org/reference/loadStrings_.html 但使用 python 的东西
  • 仅供参考:pandas 库 (pandas.pydata.org) 中的 read_csv 函数接受 URL。见pandas.pydata.org/pandas-docs/stable/generated/…

标签: python csv curl output python-2.x


【解决方案1】:

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

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

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

【讨论】:

  • 这是迄今为止我遇到的最简单的方法之一!
  • 只要您的 CSV 文件适合内存,就可以了。
  • 对我不起作用,也许我的内存不足。 pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 33, saw 2
  • 无论如何都要重试使用它,很多时候我收到 500 错误,当我再次 read_csv 时它可以工作。当我从谷歌表格中阅读时,这种情况经常发生
【解决方案2】:

您需要将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 实现(只需要稍作改动)see below

【讨论】:

  • 你能把它传给 csv_reader 吗?我想是的......它非常“像文件一样”,但我从来没有这样做过,甚至没有想过这样做
  • 大声笑我不知道我是对的我只是在问......以前从未见过这样做
  • 我只是假设它确实有效。这太疯狂了,因为我已经使用了数百次。 :D
  • 我认为 urllib2.urlopen 返回一个类似文件的对象,因此您可能只需删除.read(),并将response 传递给csv.reader
  • @mongotop 这意味着它正在工作......这向您显示了对象在内存中的位置。看起来它一次只读取一行,所以循环内的 cr.next() 可能就是您要查找的内容。 (我自己没用过csv阅读器……)
【解决方案3】:

您也可以使用 requests 模块:

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

【讨论】:

  • 像魅力一样工作!感谢您提交答案!
  • 一个问题。 reader 变量是一个 _csv.reader 对象。当我遍历此对象以打印内容时,出现以下错误。错误:迭代器应该返回字符串,而不是字节(您是否以文本模式打开文件?)。如何读取 csvreader 对象的内容并将其加载到 pandas 数据框?
  • @Harikrishna 这可能是 Python 3 中的问题,此案例在这里得到解答:stackoverflow.com/questions/18897029/…
【解决方案4】:

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

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 懒惰地遍历响应中的每一行。

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

【讨论】:

  • 这是一个很好的解决方案!谢谢@The Aelfinn!
  • 很好的解决方案,但我还必须 import codecs 并将 r.iter_lines() 包装在 codecs.iterdecode() 中,如下所示:codecs.iterdecode(r.iterlines(), 'utf-8') ... 为了解决 bytestr 问题, unicode 解码问题和通用换行问题。
  • 我一直在寻找这样的解决方案,有请求。
  • 我非常喜欢这个解决方案
【解决方案5】:

这个问题被标记为python-2.x,因此篡改原始问题或已接受的答案似乎是不对的。但是,现在不支持 Python 2,并且这个问题对于“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可以从字符串列表中读取。

由于其他人提到了熊猫,这里有一个单行代码,可以在控制台友好的输出中显示 CSV:

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

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

【讨论】:

  • 感谢@ThedudeAbides 提供更新的解决方案!
  • 只想补充一点,仅import pandas 将比此页面上的任何其他解决方案慢一个数量级。所以不要去pip install pandas 只是因为你看到你可以用它做一个很酷的单线;它还引入了 numpy 作为依赖项,并且从那里开始走下坡路。 import requests 也是如此,虽然没有达到这样的程度。
【解决方案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()

【讨论】:

    【解决方案7】:

    我也将这种方法用于 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)
    

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        • 2011-08-12
        • 1970-01-01
        相关资源
        最近更新 更多