使用python请求下载CSV

2024-05-17 04:03:41 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的代码:

import csv
import requests
with requests.Session() as s:
    s.post(url, data=payload)
    download = s.get('url that directly download a csv report')

这使我可以访问csv文件。我尝试了不同的方法来处理下载:

这将在一个字符串中给出csv文件:

print download.content

这将打印第一行并返回错误:_csv.error:未引用字段中出现的新行字符

cr = csv.reader(download, dialect=csv.excel_tab)
for row in cr:
    print row

这将在每行中打印一封信,但不会打印全部内容:

cr = csv.reader(download.content, dialect=csv.excel_tab)
for row in cr:
    print row

我的问题是:在这种情况下,读取csv文件最有效的方法是什么。 以及如何下载。

谢谢


Tags: 文件csv方法importurldownloadcontentrequests
3条回答

您还可以使用^{}来迭代{'columnname': 'value', ...}的字典

import csv
import requests

response = requests.get('http://example.test/foo.csv')
reader = csv.DictReader(response.iter_lines())
for record in reader:
    print(record)

这应该有助于:

import csv
import requests

CSV_URL = 'http://samplecsvs.s3.amazonaws.com/Sacramentorealestatetransactions.csv'


with requests.Session() as s:
    download = s.get(CSV_URL)

    decoded_content = download.content.decode('utf-8')

    cr = csv.reader(decoded_content.splitlines(), delimiter=',')
    my_list = list(cr)
    for row in my_list:
        print(row)

输出示例:

['street', 'city', 'zip', 'state', 'beds', 'baths', 'sq__ft', 'type', 'sale_date', 'price', 'latitude', 'longitude']
['3526 HIGH ST', 'SACRAMENTO', '95838', 'CA', '2', '1', '836', 'Residential', 'Wed May 21 00:00:00 EDT 2008', '59222', '38.631913', '-121.434879']
['51 OMAHA CT', 'SACRAMENTO', '95823', 'CA', '3', '1', '1167', 'Residential', 'Wed May 21 00:00:00 EDT 2008', '68212', '38.478902', '-121.431028']
['2796 BRANCH ST', 'SACRAMENTO', '95815', 'CA', '2', '1', '796', 'Residential', 'Wed May 21 00:00:00 EDT 2008', '68880', '38.618305', '-121.443839']
['2805 JANETTE WAY', 'SACRAMENTO', '95815', 'CA', '2', '1', '852', 'Residential', 'Wed May 21 00:00:00 EDT 2008', '69307', '38.616835', '-121.439146']
[...]

有答案的相关问题:https://stackoverflow.com/a/33079644/295246


编辑:如果需要下载大文件(即stream=True),其他答案也很有用。

为了简化这些答案,并在下载大文件时提高性能,下面的操作可能会更有效一些。

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:
        print row   

通过在GET请求中设置stream=True,当我们将r.iter_lines()传递给csv.reader()时,我们将向csv.reader()传递一个generator。通过这样做,我们使csv.reader()能够懒洋洋地遍历带有for row in reader的响应中的每一行。

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

相关问题 更多 >