【问题标题】:IMPORTING CSV DATAS INTO MODEL - DJANGO将 CSV 数据导入模型 - DJANGO
【发布时间】:2021-02-10 21:14:30
【问题描述】:

我正在实施一个客户列表。我想为用户提供导入新客户的可能性,例如 csv 文件。 客户端模型具有以下字段:客户端、姓名、姓氏、电子邮件、电话

所以我创建了这个模型:

class CsvClient(models.Model):
file_name = models.FileField(upload_to='csv-cliente')
uploaded = models.DateTimeField(auto_now_add=True)
activated = models.BooleanField(default=False)

def __str__(self):
    return f"File id: {self.id}"

还有views.py中的这个函数:

import csv

def importa_csv_clienti(request):
form = CVSForm(request.POST or None, request.FILES or None)

if form.is_valid():
    form.save()
    form = CVSForm()
    clients = CsvClient.objects.get(activated=False)
    with open(clienti.file_name.path, 'r') as f:
        reader = csv.reader(f)

        for i, row in enumerate(reader):
            if i==0:
                pass
            else:
                row = "".join(row)
                row = row.replace(";", " ")
                row = row.split(" ")

                client = row[0].capitalize()
                name = row[1].capitalize()
                surname = row[2].capitalize()

                value = Cliente.objects.create(
                    cliente=cliente,
                    nome=nome,
                    cognome=cognome,
                    email=riga[3],
                    telefono=riga[4],
                )

                print('oggetto creato:', value.cliente, value.nome, value.cognome, value.email, value.telefono)

        clients.activated = True
        clients.save()

context = {'form': form}
template = 'importa.html'
return render(request, template, context)

它可以工作,因为如果在 csv 文件中我有行:

Nutella Antonio Dello Iudice

在哪里 nutella 是客户 安东尼奥是名字 Dello Iodice 是姓氏 并且电子邮件和电话都是空白的

基本上它将它解释为 Dello 是姓氏,Iudice 是电子邮件。

如果姓氏由2个或多个单词组成,我如何告诉他不要分开?

PS:这是一个好奇,但我怎么知道用户导入的 csv 文件是否由 ; 分隔并不是 , ?因为我设置为分隔符“;”,但是如果用户导入一个用“,”分隔的文件,我的代码就不行了,对吧?

【问题讨论】:

    标签: django csv django-models import python-import


    【解决方案1】:

    如果我理解你的问题,你想检查一下使用的分隔符是对的吗?

    一种简单的方法是检查文件中的 ; - 如果它们的计数大于或等于 4 (0;1;2;3;4),则分隔符为 ;.

    关于拆分姓氏的第一个问题:

    row = "".join(row)
    row = row.replace(";", " ")
    row = row.split(" ")
    

    为什么要替换;有空格?只需按分隔符拆分行,因为在有效 CSV 中,不允许在内容中使用分隔符。

    row = "".join(row)
    row = row.split(";")
    

    现在您的姓氏在包含空格时不会被拆分。

    【讨论】:

      【解决方案2】:

      现在你正在替换“;”由一个空格。所以像Nutella;Antonio Dello; Iudice 这样的行将被转换为Nutella Antonio Dello Iudice

      在这个替换之后,你对空格进行拆分。

      为什么不删除row = row.replace(";", " ")而只删除row = row.split(";")

      【讨论】:

        猜你喜欢
        • 2014-08-30
        • 2014-04-14
        • 1970-01-01
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-21
        • 1970-01-01
        相关资源
        最近更新 更多