Django - 导入CSV文件时保留换行符

1 投票
2 回答
798 浏览
提问于 2025-04-18 18:19

我在Django中上传和导入一个CSV文件。每一行都有一个“描述”字段,这个字段可能会有换行符。目前,当我把数据保存到Django的TextField时,所有的换行符都消失了,这导致所有的格式都丢失了。用户不得不去网页门户或管理控制台手动调整描述字段的文本格式。这对于成百上千条记录来说,真的很麻烦,也很耗时间。

有没有办法在导入CSV文件时保持格式呢?

目前我使用的是:

file = request.FILES['csv_file']

csv_file_data = [row for row in csv.reader(file.read().splitlines())]   

2 个回答

0

我在使用 django-import-export 时也遇到了同样的问题。

最后我选择重写了 import_field 这个方法(不过如果有更好的方法,请告诉我):

# admin.py

from django.db.models.fields import TextField


class YourModelResource(resources.ModelResource):

    def import_field(self, field, obj, data, is_m2m=False):
        field_model = YourModel._meta.get_field(field.column_name)
        # keep linebreaks in TextField columns
        if type(field_model) == TextField:
            data[field.column_name] = data[field.column_name].replace('\n', '<br />\n')
        field.save(obj, data, is_m2m)
2

来自 这里:

def splitkeepsep(s, sep):
    return reduce(lambda acc, elem: acc[:-1] + [acc[-1] + elem] if elem == sep else acc + [elem], re.split("(%s)" % re.escape(sep), s), [])

所以:

file = request.FILES['csv_file']

# Updated to reflect OP's comments:
csv_file_data = [row for row in csv.reader(splitkeepsep(file.read(), '\n'), dialect=csv.excel_tab)]

撰写回答