【问题标题】:Parse First N Lines of CSV on Model Save在模型保存时解析 CSV 的前 N ​​行
【发布时间】:2017-08-16 16:09:13
【问题描述】:

我有一个用户可以上传 CSV 的模型,但是由于文件有时可能太大,我想解析上传的 CSV 的前 5 行并创建一个新的 CSV 文件。这将作为一个示例文件,以后使用时会更小更快。

这就是我的models.py 的样子:

from django.db import models

class Source(models.Model):
    file = models.FileField()
    sample = models.FileField(blank=True, null=True)
    name = models.CharField(max_length=255)

    def save(self, *args, **kwargs):
        # I want to parse the 'file' field and write it to 'sample' here


        super(Source, self).save(*args, **kwargs)

    def __str__(self):
        return self.name

基本上在模型的保存功能中,我想解析file字段的前5行并取前5行,创建一个CSV并将其上传到sample字段`。关于我如何做到这一点的任何想法?谢谢。

【问题讨论】:

    标签: python django csv django-models


    【解决方案1】:
    import csv
    import io
    from django.core.files.base import ContentFile
    from django.db import models
    
    class Source(models.Model):
        file = models.FileField()
        sample = models.FileField(blank=True, null=True)
        name = models.CharField(max_length=255)
        _generate_sample = True
    
        def save(self, *args, **kwargs):
            super(Source, self).save(*args, **kwargs)
            if self.file and self._generate_sample:
                with open(self.file.path) as f:
                    reader = csv.reader(f)
                    lines = [next(reader) for x in xrange(5)]
                output = io.BytesIO()
                writer = csv.writer(output)
                writer.writerows(lines)
                self._generate_sample = False
                self.sample.save('short.csv', ContentFile(output.getvalue()))
    
        def __str__(self):
            return self.name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      相关资源
      最近更新 更多