【问题标题】:Django CSV Import - Only importing first data row when using æ, ø ,å (danish characters) and spacesDjango CSV Import - 仅在使用æ、ø、å(丹麦字符)和空格时导入第一个数据行
【发布时间】:2020-03-07 00:50:25
【问题描述】:

我在 Django 中创建了一个带有 CSV 导入实现的系统。但是,当数据的第一列包含丹麦特殊字符 Æ、Ø 和 Å 或空格时,它只插入第一行数据。

我读到我正在使用的 Python 中的 csv 模块不支持 Unicode 输入。我提供了下面的代码,用于将 csv 文件与 Django 中的数据库模型连接起来。

注意:数据库是用Mysql制作的

views.py

def opret_hold(request):
    prompt = {
        "hold": "Rækkefølgen på inholdet af din .csv fil skal være: ma, fornavn, efternavn, hold, deling"
    }

    if request.method == 'GET':
        return render(request, 'evalsys/admin/upload/opret_hold.html', prompt)
    try:
        csv_file = request.FILES['file']

        if not csv_file.name.endswith('.csv'):
            messages.warning(request, 'Dette er ikke en .csv fil.')

        data_set = csv_file.read().decode("utf-8")
        io_string = io.StringIO(data_set)
        for row in csv.reader(io_string, delimiter=','):
            for column in csv.reader(io_string, delimiter=','):
                __, created = Hold.objects.get_or_create(
                    holdnavn=column[0],
                    slug=column[0],
                )
                created = Medarbejder.objects.get_or_create(
                    delingnavn_id=column[1],
                    slug=column[2],
                    ma=column[2],
                    fornavn=column[3],
                    efternavn=column[4],
                    holdnavn_id=Hold.objects.get(pk=(column[0])),
                )

        if request.method == 'POST' and HttpResponse.status_code == 200:
            messages.success(request, "Hold oprettet.")

    finally:
        context = {}
        return render(request, 'evalsys/admin/upload/opret_hold.html', context)

opret_hold.html

<form method="post" enctype="multipart/form-data">
                        {% csrf_token %}
                        <input type="file" name="file" required>
                        <p>Dette system acceptere kun .csv filer.</p>
                        <button type="submit" class="btn" id="generel-btn">Upload</button>
                        <br>
                    </form>

【问题讨论】:

  • 如果您使用的是 Linux,您可以在将数据导入 mysql 之前尝试“iconv”命令。也许你可以在你的 python 脚本中的某个地方实现 iconv。当我将 csv 和 json db-import 文件从 windows 上传到 linux 时,我遇到了类似的问题(不是 python 而是 perl)。我必须转换为 latin1 才能在 MongoDB 和 MySQL 中识别德语变音符号。
  • 您可以复制您的 csv 导入文件,使用 iconv 将其转换为 (latin1),如下所示: iconv -f > -t latin1 然后将转换后的文件导入 mysql测试数据库。如果丹麦语字符被识别并且导入工作,你可以在你的views.py中调用一个方法,在csv文件被导入mysql之前执行iconv命令。

标签: python mysql django csv django-views


【解决方案1】:

问题出在您的 for 循环中,您编写了 2 个仅间接访问行的循环

data_set = csv_file.read().decode("utf-8")
io_string = io.StringIO(data_set)
for row in csv.reader(io_string, delimiter=','):
   hold, created = Hold.objects.get_or_create(
    holdnavn=row[0],
    slug=row[0],
   )
   medarbejder,created = Medarbejder.objects.get_or_create(
    delingnavn_id=row[1],
    slug=row[2],
    ma=row[2],
    fornavn=row[3],
    efternavn=row[4],
    holdnavn_id=hold,
   )

【讨论】:

  • 当我只有一个循环时,什么也没有发生,但是当我有两个循环时,只要第一列“holdnavn”中的数据没有,我就可以从文件中将一些数据放入数据库包含 Æ、Ø、Å 或空格。我尝试了你的建议,但没有奏效
猜你喜欢
  • 2021-04-19
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
相关资源
最近更新 更多