【问题标题】:Django - Keep line breaks when importing CSV fileDjango - 导入 CSV 文件时保留换行符
【发布时间】:2024-04-10 21:20:01
【问题描述】:

我正在 Django 中上传和导入 CSV 文件。每行都有一个“描述”字段,可以有换行符。目前,保存到 Django TextField 时所有换行符都会丢失,这会导致所有格式丢失。然后,用户已转到 Web 门户或管理控制台并手动设置描述字段的文本格式。当您有数百条记录时,这真的很乏味且耗时。

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

目前我正在使用:

file = request.FILES['csv_file']

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

【问题讨论】:

    标签: python django excel csv import


    【解决方案1】:

    来自here

    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)]
    

    【讨论】:

    • 解决方案导致:“在未引用的字段中看到换行符 - 您需要以通用换行模式打开文件吗?”正在导入的文件是在 excel 中创建并保存为 csv。
    • 我观察到的一件事是将文件保存为 Windows CSV,然后导入不会导致该异常。此外,“\n”被替换为空格。
    • @Mehtaji:啊!我明白了:对不起!已编辑。您可能还会发现这个相关问题也很有用:*.com/questions/1875956/…
    【解决方案2】:

    我在使用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)
    

    【讨论】:

      最近更新 更多