2017-07-24 70 views
1

我從csv創建了yaml文件,這些文件中有許多unicode字符,但是我似乎無法得到它來轉儲unicode而沒有它給我一個解碼錯誤。我正在使用ruamel.yaml庫。使用YAML轉儲unicode

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 11: ordinal not in range(128) 

我試着解析字符串,unicode字符串,用「utf-8」編碼似乎沒有任何工作。我見過很多的例子,顯示增加一個代表來解決這個問題,但他們似乎都在使用舊的方法ruamel,我似乎無法找到如何在更新的方法在任何地方記錄如何做到這一點。

from ruamel.yaml import YAML 

class YamlObject(YAML): 
    def __init__(self): 
     YAML.__init__(self) 
     self.default_flow_style = False 
     self.block_seq_indent = 2 
     self.indent = 4 
     self.allow_unicode = True 

textDict = {"text": u"HELLO_WORLD©"} 
textFile = "D:\\testFile.yml" 
yaml = YamlObject() 
yaml.dump(textDict, file(textFile, "w")) 

我可以統一整個字典並且工作,但它不會給我我需要的格式。

我需要的僅僅是:

text: HELLO_WORLD© 

我怎麼能這樣做?

+0

這是Python 2還是Python 3? – jwodder

+1

@jwodder當然Python2('file'不是Python 3的內部) – Anthon

+0

是的,它是Python 2.對不起,應該說! – SamH

回答

2

您在您的派生YAML對象中缺少encoding對象。

嘗試這樣的:

class YamlObject(YAML): 
    def __init__(self): 
     YAML.__init__(self) 
     self.default_flow_style = False 
     self.block_seq_indent = 2 
     self.indent = 4 
     self.allow_unicode = True 
     self.encoding = 'utf-8' 

如果look at the definition of your base class, YAML,你會發現在默認情況下,encoding未定義:

self.encoding = None 

和它保持None通過YAML.dump()YAML.dump_all()。在全球dump()方法中,相反,encoding被設置爲默認utf-8(僅在Python 2中)。

更新。這實際上是Python 2(謝謝@安永)ruamel.yaml中的一個錯誤。

+0

非常感謝。我沒有想到要查看bitbucket文件,這將在未來非常有用。 – SamH

+1

不客氣。如有疑問,請始終檢查來源。這就是開源的美妙之處。 :)順便說一句,你可以在磁盤上很容易地檢查它,但我需要一個參考引用。 – randomir

+0

@randomir這實際上是ruamel.yaml中的一個錯誤。使用YAML對象,[self.allow_unicode始終爲True](https://bitbucket.org/ruamel/yaml/src/8b6c70d5656c40564e7e9a0f1bf4f867abc4f59e/main.py?at=default&fileviewer=file-view-default#main.py-69) 。由於您指出的'dump()'不是使用的方法,因此您指向舊API的'dump()'全局函數。當使用'yaml.dump()'而不將'self.allow_unicode'明確設置爲'True'時,這也會出錯,而不應該這樣做。 – Anthon