2012-01-31 72 views
2

在後續有人幫我在這裏與昨天Lost in XML and Python我試圖比較兩個字符串。Python的XML CSV編碼和字符

  • 字符串一個從XML文件
  • 字符串二是從CSV讀讀文件

的問題是,這兩種存儲方式不一樣:

CSV FILE HAS : "‚" 
XML FILE HAS : "‚" 

但是,如果沒有「

比較時打印字符串表明我爲什麼不匹配:

這些都是它試圖匹配

FROM XML : ‚ 
FROM CSV : x82 

這可能會發生的很多字符,那麼這個特殊的字符串。我的問題是我該如何解決這個問題?

  • 讀取XML文件的方式不同嗎?
  • 以不同方式讀取CSV文件?
  • 比較前轉換存儲的字符串?

比較後,匹配的字符串需要存儲和打印回XML格式的字符串。

這裏是我正在打開,並在我的csv文件閱讀:

import csv 
csvdata = csv.reader(open('csvsmall.csv')) 

csvfile = open(csvinput, "rb") 
dialect = csv.Sniffer().sniff(csvfile.read(1024)) 
csvfile.seek(0) 
reader = csv.reader(csvfile, dialect) 

========================== == UPDATE ============================================

好的根據答覆。我認爲這將是最容易找到一種方法來轉義字符串轉換成CSV文件的版本在XML文件中

這將意味着轉換:

"," which looks like it is being read as x82 to "‚" 

有沒有人有關於如何任何提示對存儲在字典中的csv的所有值執行此操作? :

filenameToLabel = {} 
for l,f in (x.strip().split(';') for x in (csvfile.readlines())[1:]): 
    filenameToLabel[f] = l 

回答

1

我有一個問題,似乎與你的一樣。如果不是,那麼解決我的問題的方法是將字符串投射到unicode。 我想這可能是一個更pythonic的方式,但這對我來說是個詭計。

對於解析XML文件我使用lxml,它有可能編寫unicode xml文件。

1

如果XML文件確實包含‚,意思是指定一個字符,那麼您需要通過不加帽&&預處理數據。只有在這之後,XML數據纔會包含適當的字符引用,然後您需要正確解釋XML - 其中包括解釋字符引用。

如果CSV數據在字節級爲「0x82」,那麼CSV數據採用windows-1252編碼或類似的方式。 CSV格式本身沒有編碼的指示,所以您需要從其他來源知道它並應用合適的轉碼。這意味着在實踐中轉碼爲UTF-8,無論是閱讀文件還是外部文件。

+0

&&部分似乎被正確處理,因爲當我打印出兩個字符串時,它們應該互相匹配,它會返回‚作爲XML文件中的字符串,x82作爲CSV文件中的字符串。 csv由另一個程序生成,我不知道它使用的編碼。但在編輯器中打開它會顯示「,」返回x82的位置。有沒有一種簡單的方法來獲得兩個文件在相同的編碼?最好是XML中的那個? – LessPythonic 2012-01-31 16:07:14

1

將CSV數據轉換爲HTML字符引用不是一個好主意。一般來說,將它們轉換爲簡單和簡單的Unicode通常會更好。

在XML解析器的輸出中有‚等。這可以使用effbot's unescape function來轉義,它也處理實體和十六進制字符引用。您應該在從XML解析器獲取數據後立即執行此操作。

您應該使用適當的編碼解碼您的csv數據,可能是cp1250等家族中的一種。你只給我們一個信件,「&#8128」< - >\x82。所有的Windows編碼cp1250cp1258包括012B的字節解碼爲U+201A SINGLE LOW-9 QUOTATION MARK。爲了幫助您選擇哪一個,請告訴我們您擁有的任何其他信件,以及創建的國家/地區,創建該文件的計算機上生效的語言環境,寫入文本的語言,以及任何其他背景信息你有。