Python Django视图从CSV解码丹麦字符
我有一个csv文件,其中包含一些奇怪(不正确)的丹麦编码字符(å-ø-æ)。在Django视图中,我试图从文件的第一行获取字符串,从第二行获取日期。如果我复制粘贴它,该文件看起来像这样Python Django视图从CSV解码丹麦字符,python,django,csv,Python,Django,Csv,我有一个csv文件,其中包含一些奇怪(不正确)的丹麦编码字符(å-ø-æ)。在Django视图中,我试图从文件的第一行获取字符串,从第二行获取日期。如果我复制粘贴它,该文件看起来像这样 01,01,Project Name: SAM_LOGIK_rsm¿de_HD,,,Statistics as of: Sat Oct 01 17:09:16 2016 02,01,Project created: Tue Apr 12 09:10:16 2016,,,Last Session Started:
01,01,Project Name: SAM_LOGIK_rsm¿de_HD,,,Statistics as of: Sat Oct 01 17:09:16 2016
02,01,Project created: Tue Apr 12 09:10:16 2016,,,Last Session Started: Sat Oct 01 16:59:22 2016
字符串SAM_LOGIK_rsm?de_HD应该是SAM_LOGIK_Årsmøde_HD-这是我要存储在数据库中的值
我正在用iso-8859-1解码文件(否则我会出错)
这存储字符串“原样”,我不确定在将其存储到数据库之前如何将其转换回丹麦语。DB和Django被设置为与丹麦CHAR合作
如果我试着把它解码成utf.8,我会得到一个UnicodeDecodeError,它会显示更多的信息
01,01,Project Name: SAM_LOGIK_\x81rsm\xbfde_HD,,,Statistics as of: Sat Oct'
01 17:09:16 2016\r02,01,Project created: Tue Apr 12 09:10:16 2016,,,Last'
编辑:
我发现csv中的字符串实际上已经损坏——创建它们的应用程序(Avid Media Composer)至少一致地为-Å-å-Æ-Ø-Ø应用相同的值
Å = \x81 unassigned in UTF8
å = Œ - u"\u0153" OE ligature
Æ = ® - chr(174)
æ = ¾ - chr(190)
Ø = » - chr(187)
ø = ¿ - chr(191)
我是这样修好的
replacements = {'\x81':'Å','Œ':'å','®':'Æ','¾':'æ','¿':'ø','»':'Ø'}
with open(newest, 'rt', encoding='iso-8859-1') as csvfile:
for i, row in enumerate(csvfile):
if "Project Name:" in row:
this = row.split(',')
project_list.append("".join([replacements.get(c, c) for c in this[2][14:]]))
if i >= 1:
break
else:
this = row.split(',')
date = datetime.strptime(this[5][22:-1], '%c') # datetime object
project_list.append(date)
if i >= 1:
break # break at row 2
试试看
行。解码('iso-8859-1')。编码('utf-8')
如果使用“with”语句,则无需关闭文件这在解码时是正确的,但问题在我的编辑中发生了变化。
replacements = {'\x81':'Å','Œ':'å','®':'Æ','¾':'æ','¿':'ø','»':'Ø'}
with open(newest, 'rt', encoding='iso-8859-1') as csvfile:
for i, row in enumerate(csvfile):
if "Project Name:" in row:
this = row.split(',')
project_list.append("".join([replacements.get(c, c) for c in this[2][14:]]))
if i >= 1:
break
else:
this = row.split(',')
date = datetime.strptime(this[5][22:-1], '%c') # datetime object
project_list.append(date)
if i >= 1:
break # break at row 2