Django查看从CSV

时间:2016-10-20 15:14:58

标签: 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: Sat Oct 01 16:59:22 2016

字符串SAM_LOGIK_rsm¿de_HD应该是SAM_LOGIK_Årsmøde_HD - 这是我想要存储在数据库中的值。

我用iso-8859-1解码文件(否则我收到错误)。

with open(latest, 'rt', encoding='iso-8859-1') as csvfile:
        for i, row in enumerate(csvfile):
            if "Project Name:" in row:
                this = row.split(',')
                project_list.append(this[2][14:]) # gets the project name as is
                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
    csvfile.close()

这会将字符串'按原样'存储,我不知道在将其存储到数据库之前如何将其转换回丹麦语。 DB和Django设置为与丹麦字符一起使用。

如果我尝试将其解码为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

1 个答案:

答案 0 :(得分:1)

试试

row.decode('iso-8859-1').encode('utf-8')

如果您使用""关闭文件的声明是不必要的