2017-06-20 287 views
1

我使用Python 2.7的unicodecsv嵌入式模块来读取包含28种不同语言的单词列的CSV文件,其中一些文件有重音和/或完全利用不同的字母/字符系统。我加载的CSV将UTF-8转义字符读取/解码为本机字符

with open(sourceFile, 'rU') as keywordCSV: 
    keywordList = csv.reader(keywordCSV, encoding='utf-8-sig', dialect=csv.excel) 

keywordList阅读目前正在生产的Unicode转义字符/序列,而不是本地字符符号。虽然这并不理想(理想情况下,我可以从一开始就将csv中的unicode加载为本地字符符号),但只要我可以在脚本中稍后将这些符号转换为本地字符符号(在导出为无论哪种文件类型都会使这个最简单)。这是如何做的,或者最好是理想的情况?我试图使用变通方法,如these无济于事,我仍然不确定这是脚本中的解释器问题还是编码问题。

读取文件时,我已经使用utf-8-sig的原因是,没有这样做,是导致(BOM

UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 155: 

,但是现在已经停止发生的原因不为人知我。同样,打开文件不这样做,当我使用'rU'产生

_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode? 

,但我不知道如果这些都是适当的。

this问题,通过在天然字符中的一个的结果打印每一个字符一个正在打印(一些也适用于从终端运行时我的代码),是有通过人物迭代和转换每一个的方式到它的本土特征?

对于在这个已经饱和的话题上发布另一个问题的道歉,但我还没有能够得到其他人的建议,为这种情况下工作。也许我一直在寻找错误的地方,试图解码脚本末尾的编码csv输出,而问题出在我的csv.readerencoding。任何帮助将非常感激。

+1

编解码器可能是更好的选项来读取非ascii字符的文件。 https://docs.python.org/2/library/codecs.html, –

+1

检查一下,它与你有关。 https://codepoints.net/U+FEFF –

+0

我试过多个'.encode()'和'.decode()'组合,但没有成功。你将如何去实现编解码器? –

回答

1

你所看到的是你的Unicode字符的repr()。在Python 2.7中,repr()通常只显示ASCII字符。 ASCII范围之外的字符使用转义显示。这是为了调试目的,使当前代码页不支持非打印字符或字符可见。如果你想看到的字符呈现,打印出来,但请注意,不是由终端的配置代码页不支持的字符可能无法正常工作:

>>> s = u'\N{LATIN SMALL LETTER E WITH ACUTE}' 
>>> s 
u'\xe9' 
>>> print repr(s) 
u'\xe9' 
>>> print s 
é 
>>> print unicode(s) 
é 

在下列情况下,字符不被配置代码支持页437:

>>> s = u'\N{HORIZONTAL ELLIPSIS}' 
>>> s 
u'\u2026' 
>>> print s 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\dev\Python27\lib\encodings\cp437.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_map) 
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2026' in position 0: character maps to <undefined> 
+0

感谢您澄清问题。我想编写本地字符(不是Unicode转义序列,这是当我使用utf-8编码调用'json.dumps()'时写入的内容)到JSON文件,我该怎么做? –