【问题标题】:Python issues with csv,xml and special characterscsv、xml 和特殊字符的 Python 问题
【发布时间】:2013-12-16 14:00:56
【问题描述】:

我目前正在尝试根据预定义的模式从 csv 文件中收集文本数据,并将其转换为可读的 XML。我的问题似乎源于读写挪威特殊字符(ø、æ、å),并且不了解如何正确使用 unicode。

with open(inputfile, 'rb') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
idflag=False
try:
    for row in reader:
        if idflag:
            #print row[0]
            toEBU(row,id_row)
            #idflag=False #for testing, limits iterations
        if row[0].lower()=='id':
            idflag=True
            id_row=row

这是读取 .csv 文件的代码。 toEbu 函数处理 XML 转换:

def toEBU(row,id_row):
file_id=unicode(row[0],"utf-8")
file_source=unicode(row[2],"utf-8")
file_type=unicode(row[3],"utf-8")
file_name=unicode(row[4],"utf-8")
file_desc=unicode(row[5],"utf-8")
file_keys=unicode(row[9],"utf-8")
file_rights=unicode(row[10],"utf-8")
keywords = file_keys.split(',')
#print row[0],row[4]
#Remember to use .strip() to remove spaces before or after string

if file_name=='' or row[1]=='Nei':
    print 'Name Error'
    return


tree = ET.parse('EBUBase.xml')
EBUMain = tree.getroot()
EBUMain.tag= 'ebucore:ebuCoreMain'
coreMetaData = ET.Element('ebucore:coreMetaData')
EBUMain.append(coreMetaData)

indent(EBUMain)


tree = ET.ElementTree(EBUMain)
xmlfile='xml\\' +file_id.strip()+'.xml'

#xmlfile=xmlfile.encode('utf-8')
print xmlfile
try:
    tree.write(xmlfile, xml_declaration=True, encoding='utf-8', method="xml")
except IOError:
    print 'Invalid Filename'

我得到的错误如下:

Traceback (most recent call last):
  File "extractor.py", line 121, in <module>
    main(sys.argv[1:])
  File "extractor.py", line 106, in main
    toEBU(row,id_row)
  File "extractor.py", line 26, in toEBU
    file_name=unicode(row[4],"utf-8")
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe5 in position 9: invalid c
ontinuation byte

第[4]行中的字符串是“Bryllup på Terningen”。

我尝试使用 unicode csv 解析器读取数据,但这似乎也会产生错误。所以我试图在写入 XML 之前将字符转换为 unicode。以前,我在编写相同的字符串时遇到问题,并且代码会在 tree.write(XX) 部分失败。

编辑: 从 csv 文件中添加了一个示例:

18.6.,,Leveranse,Ferdig redigert 30 min AV presentason,Visning,Formidling,Digital historie,Ingen planer,,,
,,Kontaktperson,Tittel,E-post,Telefon,,,,,
,,XXXX XXXXX XXXXX,XXXXXXXXXXX,XXXX@XXXXXX.XXXX.XXXX,XXXXXXXX,,,,,
,,,,,,,,,,
Id,Arkiv,Kilde,Modalitet,"Parametre, Filnavn","Beskrivelse, fri tekst",Script,Dreiebok,Opptaksplan,Nøkkelord,Rettigheter
D5.1,Nei,E,Tekst,,Manus til videoforelesning (inneholder deler og bilder  som beskrives under),Historisk oversikt over fyr og fyrliv i Frøya og Hitra,,Etter avtale med MMS,"Fyr, fyrstasjon",
D5.2,Ja,E,Video,25 minutter??,Film fyrvokter,Inspeksjonstur på Slettringen,,Opptak gjort av «Frøya Film og bilde» v Petter Vågsvær 2011,Fyrvokter slettringen,??
D5.3,Ja,E,Tekst,Fyr i krig,Digital fortelling,"Krigshistorie på fyr, med fokus på fyr i Trlag",,,"Krig, luftangrep, terningen",

第一行被忽略,只有以“D5.X”开头的行被发送到“toEBU”。

【问题讨论】:

  • 您确定,您正在阅读的文件是使用 utf-8 编码的吗?
  • 不,如前所述,我真的不知道自己在做什么。这是一个cvs文件。我有点假设尝试将所有内容转换为 utf-8 会神奇地解决所有问题。正如我认为 utf-8 会支持 'æøå'
  • 您能否粘贴一个包含非 ASCII 字符的单词的示例,与它们在原始 CSV 中的显示完全相同?例如通过添加grep 'Bryllup' input.csv | hexdump -C? 的输出
  • 你能给我一些csv文件的样本吗?
  • 添加了一个示例,重新编辑以删除联系信息。

标签: python xml csv unicode


【解决方案1】:

归根结底,您的文件可能以“iso8859-1”编码。我可以使用以下命令创建文件的(较小)版本:

from codecs import EncodedFile
with EncodedFile(open('n.txt','wb'),'utf-8','iso8859-1') as f:
 f.write('Bryllup på Terningen')

EncodedFile 的参数表示原始(在 python 中)是 'utf-8' 并且文件是用 'iso8859-1' 编码的。现在,如果我使用 'iso8859-1' 读取文件,我没问题,但 'utf-8' 会报错:

>>> unicode(open('n.txt','rb').read(),'iso8859-1')
u'Bryllup p\xe5 Terningen'

>>> unicode(open('n.txt','rb').read(),'utf-8')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-8-2649b633aa10> in <module>()
----> 1 unicode(open('n.txt','rb').read(),'utf-8')

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe5 in position 9: invalid continuation byte

【讨论】:

  • 谢谢!对于如何对 XML 文件中的字符串进行编码,是否有任何形式的公认“最佳实践”?我想知道我是否应该费心转换为 unicode,并将所有内容保留为 iso8859 格式,或者我是否应该使用 utf-8 编写。
  • 我知道这是几年前的事了,但我刚刚遇到了一个类似的问题,并想指出我最终将所有内容都转换为 unicode,而不是用 utf-8 编写。不确定这是否会对未来的用户有所帮助,或者它是否是最佳实践,但它为我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多