繁体   English   中英

用Python将unicode字符写入文件

[英]Writing unicode characters to file in Python

取得以下样本数据(可在此处找到整个列表):

Ω≈ç√∫˜µ≤≥÷
åß∂ƒ©˙∆˚¬…æ
œ∑´®†¥¨ˆøπ“‘
¡™£¢∞§¶•ªº–≠
¸˛Ç◊ı˜Â¯˘¿
ÅÍÎÏ˝ÓÔÒÚÆ☃
Œ„´‰ˇÁ¨ˆØ∏”’
ヽ༼ຈل͜ຈ༽ノ ヽ༼ຈل͜ຈ༽ノ 
(。◕ ∀ ◕。)
`ィ(´∀`∩
_   _ロ(,_,*)
・( ̄∀ ̄)・:*:

我一直将数据从前述的字符串转储输出到单独的HTML文件中(无需详细介绍,因为这与问题无关),如下所示:

for value in tags['tags']:
    for line in data:
        with open('./output/fuzzml' + str(file_count), 'w') as output:
            parsed_string = value.replace('[[VAR]]', u''.join(line.rstrip()))
            output.write(parsed_string)
            file_count += 1

在碰到一些棘手的符号(例如上面的符号)之前,它对于数据转储的一小部分效果很好。 我多次修改了第5行( u''.join(line.rstrip()) ),希望以一种可以正确输出任何内容的方式编写,但是它总是会卡在某个点上,并会引发UnicodeDecodeError异常:

Traceback (most recent call last):
File "generate-html.py", line 37, in <module>
  main()
File "generate-html.py", line 34, in main
  generate_html(tag_file, data_file)
File "generate-html.py", line 18, in generate_html
  parsed_string = value.replace('[[VAR]]', u''.join(line.rstrip()))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)

tags是从具有以下示例集的JSON文件中提取的:

"tags": [
          "<img src=\"[[VAR]]\">",
          "<a href=\"[[VAR]]\"><img src=\"[[VAR]]\">",
          "<script>[[VAR]]</script>",
          "<[[VAR]]>Hello World<[[VAR]]>"
   ]

data只是上述链接/样本数据中的原始字符串。

问题在于您在这里对u''.join()

u''.join(line.rstrip())

这是毫无用处的。 它将字符串分解为单个字符,然后再次将其重新合并为unicode字符串。 您可能打算这样做的副作用:隐式转换为unicode字符串。

您可以通过以下方式获得相同的效果:

unicode(line.rstrip())

它将因完全相同的错误而失败,因为这两个版本都不会告诉Python字节串使用了哪种编解码器来编码您的字符。

明确地解码行; 链接到的文件编码为UTF-8:

unicode(line.rstrip(), 'utf-8')

要么

line.rstrip().decode('utf-8')

下一个问题是您的parsed_string对象现在也是Unicode对象,因此在写入文件时需要再次对其进行编码:

output.write(parsed_string.encode('utf8'))

或使用io.open()函数打开一个在编写时为您编码Unicode字符串的文件对象。

您可能需要阅读:

在继续全面了解Python和Unicode如何协同工作之前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM