簡體   English   中英

帶有csv,xml和特殊字符的Python問題

[英]Python issues with csv,xml and special characters

我目前正在嘗試根據一個預先定義的模式,從一個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]行中的字符串是“ Brylluppå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”。

為了簡化它,您的文件可能被編碼為“ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM