Python Django CSV导入-使用æ;时仅导入第一个数据行øå;(丹麦语字符)和空格
我已经在Django中创建了一个带有CSV导入实现的系统。但是,当数据的第一列包含丹麦特殊字符Æ、Ø和Å或空格时,它只插入第一个数据行 我读到我正在使用的Python中的csv模块不支持Unicode输入。我提供了下面的代码,用于连接Django中的csv文件和数据库模型的函数 注:数据库采用Mysql制作 视图.pyPython Django CSV导入-使用æ;时仅导入第一个数据行øå;(丹麦语字符)和空格,python,mysql,django,csv,django-views,Python,Mysql,Django,Csv,Django Views,我已经在Django中创建了一个带有CSV导入实现的系统。但是,当数据的第一列包含丹麦特殊字符Æ、Ø和Å或空格时,它只插入第一个数据行 我读到我正在使用的Python中的csv模块不支持Unicode输入。我提供了下面的代码,用于连接Django中的csv文件和数据库模型的函数 注:数据库采用Mysql制作 视图.py def opret_hold(request): prompt = { "hold": "Rækkefølgen på inholdet af din .
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\u 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>
{%csrf_令牌%}
Dette system Accepter kun.csv文件管理器
上传
问题出在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,
)
如果您使用的是Linux,那么可以在将数据导入mysql之前尝试“iconv”命令。也许您可以在python脚本中的某个地方实现iconv。当我将csv和json db导入文件从windows上传到linux时,我遇到了类似的问题(不是python而是perl)。为了在MongoDB和MySQL中识别德文Umlaute,我必须转换为拉丁文1。您可以复制csv导入文件,使用iconv将其转换为(拉丁文1),如下所示:iconv-f-t latin1,然后将转换后的文件导入MySQL测试数据库。如果识别出丹麦字符并且导入工作正常,您可以在views.py中调用一个方法,该方法在csv文件导入mysql之前执行iconv命令。当我只有一个循环时,什么都不会发生,但当我有两个循环时,只要第一列中的数据存在,我就可以从文件中获取一些数据到数据库中“holdnavn”不包含Æ、Ø、Å或空格。我尝试了你的建议,但没有效果