`
wx1568016009
  • 浏览: 23575 次
文章分类
社区版块
存档分类
最新评论

更高效的Python CSV文件导出

 
阅读更多

阅读本文大概需要6分钟

640?wx_fmt=jpeg

在上一篇文章,我介绍了CSV是什么?CSV有哪些优点?如何使用等等?并且最后我们用一个例子简单讲解了如何使用Python模块CSV进行导出后缀为.csv的文本文件。

具体文章参看:Python模块之CSV导出(一)

其实例子用于异步导出数据文件是够了,但工作中我们可能还需要结合我们Web框架进行更复杂的CSV导出。

所以今天我们的目的就是结合Python Django框架进行分享CSV导出的另外一种方式。

安装依赖

这里面我们需要安装一个第三方包djangorestframework-csv

$ pip install djangorestframework-csv

有些同学可能不太明白,明明是Django框架怎么和Django REST Framework(简称DRF)扯上关系了,简单解释一下,由于我们Django API开发常常配合DRF进行,所以一般都是一起安装使用了的,把Django和DRF结合起来整个RESTFul API开发效率能大大提高,建议稍微大一点工程化项目都去使用DRF。

使用

使用方式如下:

  1. 继承CSVRenderer 定义一个自己的Render类

  2. 将要生成CSV的字典数据传入该类的方法render方法

  3. 使用HttpResponse或者StreamingHttpResponse进行返回

看起来是不是简单方便,确实就是这么简单,下面我们看一个例子。

例子

废话不多说,直接上代码,先定义一个自己的CSV Render

# 定义CSV Render
from rest_framework_csv import renderers

class YourModelRender(renderers.CSVStreamingRenderer):
    header = [
        'phone',
        'remark',
        'create_time',
    ]
    labels = dict([
        ('phone', u'联系电话'),
        ('remark', u'备注'),
        ('create_time', u'时间'),
    ])

这里使用label dict属性将自定义标签应用于CSVRenderer,其中每个键对应于表头header,值对应于该表头header的自定义标签,这样我们各个值就能和header对应起来。

Django导出的view方法,源码如下。

    @list_route(methods=['get']) # 这是DRF生成URL的方式,没用过的可以忽略。
    def example_export_csv(self):
        '''
        CSV 案例
        '''
        queryset = YourModel.objects.all()
        renderer = YourModelRender()
        data = (
            YourModelListSerializer(instance).data ## 得到字典数据
            for instance in queryset
        )
        response = StreamingHttpResponse(
            renderer.render(data),
            content_type='text/csv'
        )
        response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
        return response

上面几行代码是不是看起来很简单,确实就是这么简单,简单的背后是rest_framework_csv帮我们做了导出功能,底层实现还是昨天我说的那种方式write,writerow的方式。

这里面简单解释一下:

  1. YourModelListSerializer写过DRF的同学知道这个就是定义数据处理逻辑校验,格式化什么等操作。这里面我们通过YourModelListSerializer复用了其他模块处理逻辑,如RRESTFul的列表数据展示。

  2. 这样大大减少了我们导出CSV还需要去重新处理多个字段组装,过滤,变换等逻辑。因为往往我们列表需要展示数据就是我们CSV要导出的数据。记得几年前那会儿导出数据还要自己重新组装数据,真是酸爽。

  3. 我们这儿用了StreamingHttpResponse,将文件内容进行流式传输,对于实时导出大文件,可以避免服务器断开连接。比起HttpResponse更节约内存。

 其他

上面我们使用DRF,并且也用了看起来复杂的YourModelListSerializer这种复杂的概念,主要目的是让大家知道DRF的方式,至于普通使用Django其实我们完全可以把renderer.render(data)换为上一篇文章(writer.writerow(row) for row in rows) 这种形势。

关于CSV我们还可以用Django模板形式进行,和我们用rest_framework_csv模块思路差不多

csv_data = (
        ('First row', 'Foo', 'Bar', 'Baz'),
        ('Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"),
    )
    t = loader.get_template('my_template_name.txt') # 定义模板代码
    c = Context({
        'data': csv_data,
    })
response.write(t.render(c))
return response

虽然思路相似,但过程实现会麻烦较多,你要去切换模板代码书写,渲染,不推荐这种方式。


最后关于CSV我们就介绍到这里,结合上一篇主要两种方式:

  1. 普通CSV导出+Celery Beat定时导出

  2. Django + DRF + 实时导出

原理都是Python内置模块CSV的一些变换,只是结合第三库,让我们操作更快更方便起来。

640?wx_fmt=jpeg

扫码免费加入我们


更多阅读:

Python模块之CSV导出(一)

你必须知道的10个Python第三库

640?wx_fmt=jpeg

分享到:
评论

相关推荐

    用python脚本从Cadence导出xdc约束文件-csv2xdc

    标题 "用python脚本从Cadence导出xdc约束文件-csv2xdc" 涉及的是在电子设计自动化(EDA)领域中,如何利用Python编程语言处理Cadence设计工具的约束文件。Cadence是一款广泛使用的集成电路设计软件,而XDC(Xilinx ...

    使用Python编程以CSV方式导出Prometheus指定的监控数据

    使用Python编程以CSV方式导出Prometheus指定的监控数据,只要获取PMSQL填入变量即可轻松导出~

    Python-csvstosqlite将CSV文件转换成SQLite数据库

    而CSV(Comma Separated Values)文件则是一种常见的数据交换格式,因其简单易读和通用性,被广泛用于数据导入和导出。当需要将大量CSV数据存储到一个结构化的数据库中时,Python库`csvs-to-sqlite`提供了一个方便的...

    Csv导入导出.rar

    - 大文件处理:对于非常大的CSV文件,读写速度可能会变慢,需要考虑分块处理或使用更高效的数据存储格式。 7. 解决方案实现: 压缩包中的"导入导出"可能是实现CSV导入导出功能的代码示例或工具,可能包括了不同...

    Python-csvsql用SQL查询你的CSV文件

    总的来说,Python-csvsql是一个强大的工具,它使得处理CSV文件变得更加直观和高效,尤其对于熟悉SQL但不希望搭建完整数据库环境的用户来说,是一个理想的选择。通过掌握这个工具,我们可以更便捷地进行数据探索和...

    TIA博途wincc如何将变量归档记录导出为.CSV文件进行查看?.docx

    6. **指定保存路径**:在“导出数据”对话框中,指定导出文件的名称和存储位置。建议选择一个方便查找的地方,并为文件命名一个有意义的名称。 7. **导出格式设置**:确认导出的文件格式为CSV。虽然可能有其他选项...

    CSV文件转矢量,并用克里金进行插值处理,矢量转栅格,python

    本主题涉及到将CSV文件转换为矢量格式,然后使用克里金插值方法将其转化为栅格数据的过程,这一过程通常在Python环境中执行。以下是这个过程的详细解释。 1. CSV文件:CSV(Comma Separated Values)是一种通用的、...

    csv文件生成python源码

    CSV文件因其简洁、易读、易处理的特性,被广泛应用于数据分析、数据导入导出等领域。本篇文章将深入探讨如何使用Python来生成CSV文件,特别针对京东猪脸识别比赛中的场景进行说明。 首先,我们需要了解Python中的`...

    python处理csv中的空值方法

    在本篇教程中,将会介绍如何使用Python语言来处理CSV文件中的空值。CSV文件广泛应用于数据存储和交换,由于其结构简单和易于编辑,经常被用于各种数据分析和机器学习工作中。在实际使用过程中,由于各种原因,CSV...

    python 利用pyhive 导出excel

    python 利用pyhive 连接hiveserver2,系统linux 系统,通过pd 导出excel

    csv导出大量数据

    本篇文章将深入探讨CSV导出大量数据的相关知识点。 1. CSV文件结构 CSV文件的基本结构非常简单,每一行代表一个记录,每列数据由逗号分隔。列的顺序和名称通常在文件的第一行作为表头。例如: ``` 姓名,年龄,城市 ...

    Python之csv文件从MySQL数据库导入导出的方法

    Python从MySQL数据库中导出csv文件处理 csv文件导入MySQL数据库 import pymysql import csv import codecs def get_conn(): conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db...

    Testlink 用例导出xml文件转csv格式(python)

    PYTHON2.7编写的脚本,用于将testlink中导出的xml用例文件转换成csv文件; 支持testlink1.9.16

    CSV表格拆分,可以把一个CSV文件按固定行数拆分成多个文件

    2. **分布式处理**:在分布式计算环境中,小文件更容易并行处理。 3. **上传限制**:某些服务可能限制单个文件大小,拆分后可分别上传。 4. **备份与恢复**:小文件备份更快,恢复时可单独恢复部分文件。 ### 拆分...

    python读取csv文件

    在数据库领域,如果CSV文件是用来导入或导出数据库的,Python的`sqlite3`模块(或其他数据库适配器,如`psycopg2`)可以帮助完成这项任务。首先建立数据库连接,然后使用SQL命令将CSV数据插入表格,或者将数据库查询...

    使用Python对Csv文件操作共5页.pdf.zip

    8. **CSV文件与数据库的交互**:Python还可以将CSV文件导入到数据库(如SQLite、MySQL等),或者从数据库导出为CSV。这对于数据分析和存储非常有用。 9. **性能优化**:对于大量数据,可以使用生成器函数和上下文...

    怎么用python读取csv文件

    总结来说,Python的`csv`模块适合简单的CSV文件读写操作,而`pandas`更适合复杂的数据处理和分析任务。根据具体需求,你可以选择合适的方法来读取CSV文件。在实际应用中,通常推荐使用`pandas`,因为它提供了更高级...

    高性能导出csv

    下面我们将详细探讨如何实现高性能的CSV导出。 1. **内存管理与数据分块** 高性能CSV导出首先要考虑的是内存管理。一次性将所有数据加载到内存可能导致内存溢出,尤其是处理大量数据时。为了解决这个问题,可以...

    Python CSV模块使用实例

    Python的CSV模块是一个用于处理CSV(Comma Separated Values)文件的强大工具,它允许程序员以结构化的方式读取和写入CSV数据。CSV文件是一种常见的数据交换格式,尤其适用于存储表格数据,例如电子表格或数据库。在...

    读取csv文件中指定行列的数据

    在IT行业中,处理数据是日常任务之一,而CSV(Comma Separated Values)文件因其简单易用、跨平台兼容性好而广泛应用于数据交换。本教程将深入探讨如何使用Java在Eclipse集成开发环境中读取CSV文件中的指定行和列...

Global site tag (gtag.js) - Google Analytics