【发布时间】: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