将 Unicode 文本写入文本文件?

2025-01-08 08:50:00
admin
原创
99
摘要:问题描述:我正在从 Google 文档中提取数据,对其进行处理,然后将其写入文件(最终将其粘贴到 Wordpress 页面中)。它有一些非 ASCII 符号。如何才能安全地将这些符号转换为可以在 HTML 源代码中使用的符号?目前,我正在将所有内容转换为 Unicode,将其全部合并到 Python 字符串中...

问题描述:

我正在从 Google 文档中提取数据,对其进行处理,然后将其写入文件(最终将其粘贴到 Wordpress 页面中)。

它有一些非 ASCII 符号。如何才能安全地将这些符号转换为可以在 HTML 源代码中使用的符号?

目前,我正在将所有内容转换为 Unicode,将其全部合并到 Python 字符串中,然后执行以下操作:

import codecs
f = codecs.open('out.txt', mode="w", encoding="iso-8859-1")
f.write(all_html.encode("iso-8859-1", "replace"))

最后一行有一个编码错误:

UnicodeDecodeError:'ascii'编解码器无法解码位置12286处的字节0xa0:序数不在范围内(128)

部分解决方案:

这个Python运行没有错误:

row = [unicode(x.strip()) if x is not None else u'' for x in row]
all_html = row[0] + "<br/>" + row[1]
f = open('out.txt', 'w')
f.write(all_html.encode("utf-8"))

但是如果我打开实际的文本文件,我会看到很多符号,例如:

Qur’an 

也许我需要写入文本文件以外的东西?


解决方案 1:

尽可能只处理 unicode 对象,即在第一次获取对象时将其解码为 un​​icode 对象,并在输出时根据需要对其进行编码。

如果您的字符串实际上是一个 unicode 对象,则需要在将其写入文件之前将其转换为 unicode 编码的字符串对象:

foo = u'Δ, Й, ק, ‎ م, ๗, あ, 叶, 葉, and 말.'
f = open('test', 'w')
f.write(foo.encode('utf8'))
f.close()

当你再次读取该文件时,你将获得一个unicode编码的字符串,你可以将其解码为unicode对象:

f = file('test', 'r')
print f.read().decode('utf8')

解决方案 2:

Unicode 字符串处理在 Python 3 中已经标准化。

  1. 字符已以 Unicode(32 位)形式存储在内存中

  2. 您只需要以 utf-8 格式打开文件

(从内存到文件,会自动执行 32 位 Unicode 到可变字节长度 utf-8 的转换。)

out1 = "(嘉南大圳 ㄐㄧㄚ ㄋㄢˊ ㄉㄚˋ ㄗㄨㄣˋ )"
fobj = open("t1.txt", "w", encoding="utf-8")
fobj.write(out1)
fobj.close()

解决方案 3:

在 Python 2.6+ 中,你可以在 Python 3 上使用io.open()默认(builtin ):open()

import io

with io.open(filename, 'w', encoding=character_encoding) as file:
    file.write(unicode_text)

如果您需要逐步写入文本(无需unicode_text.encode(character_encoding)多次调用),这可能会更方便。与codecs模块不同,io模块具有适当的通用换行符支持。

解决方案 4:

前言:你的查看器会起作用吗?

确保您的查看器/编辑器/终端(无论您如何与 utf-8 编码文件交互)可以读取该文件。这在Windows上经常出现,例如记事本。

将 Unicode 文本写入文本文件?

在 Python 2 中,open从模块中使用(这与Python 3 中的io内置函数相同):open

import io

一般来说,最佳实践是用于UTF-8写入文件(我们甚至不必担心 utf-8 的字节顺序)。

encoding = 'utf-8'

utf-8 是最现代且普遍使用的编码 - 它适用于所有网络浏览器、大多数文本编辑器(如果有问题,请查看您的设置)和大多数终端/shell。

在 Windows 上,utf-16le如果您只能在记事本(或其他受限查看器)中查看输出,您可以尝试。

encoding = 'utf-16le' # sorry, Windows users... :(

只需使用上下文管理器打开它并写出您的unicode字符:

with io.open(filename, 'w', encoding=encoding) as f:
    f.write(unicode_object)

使用许多 Unicode 字符的示例

下面是一个示例,它尝试将每个可能的字符(最多 3 位宽,4 位是最大值,但有点太宽)从数字表示(以整数表示)映射到编码的可打印输出,如果可能的话,还映射其名称(将其放入名为的文件中uni.py):

from __future__ import print_function
import io
from unicodedata import name, category
from curses.ascii import controlnames
from collections import Counter

try: # use these if Python 2
    unicode_chr, range = unichr, xrange
except NameError: # Python 3
    unicode_chr = chr

exclude_categories = set(('Co', 'Cn'))
counts = Counter()
control_names = dict(enumerate(controlnames))
with io.open('unidata', 'w', encoding='utf-8') as f:
    for x in range((2**8)**3): 
        try:
            char = unicode_chr(x)
        except ValueError:
            continue # can't map to unicode, try next x
        cat = category(char)
        counts.update((cat,))
        if cat in exclude_categories:
            continue # get rid of noise & greatly shorten result file
        try:
            uname = name(char)
        except ValueError: # probably control character, don't use actual
            uname = control_names.get(x, '')
            f.write(u'{0:>6x} {1}    {2}
'.format(x, cat, uname))
        else:
            f.write(u'{0:>6x} {1}  {2}  {3}
'.format(x, cat, char, uname))
# may as well describe the types we logged.
for cat, count in counts.items():
    print('{0} chars of category, {1}'.format(count, cat))

这应该运行大约一分钟,然后您就可以查看数据文件,如果您的文件查看器可以显示 unicode,您就会看到它。有关类别的信息可以在这里找到。根据计数,我们可以通过排除没有与之关联的符号的 Cn 和 Co 类别来改善我们的结果。

$ python uni.py

它将显示十六进制映射、类别、符号(除非无法获取名称,因此可能是控制字符)和符号的名称。例如

我建议less在 Unix 或 Cygwin 上(不要将整个文件打印/cat 到输出中):

$ less unidata

例如将显示类似于以下几行的内容,这些内容是我使用 Python 2(unicode 5.2)从中采样的:

     0 Cc NUL
    20 Zs     SPACE
    21 Po  !  EXCLAMATION MARK
    b6 So  ¶  PILCROW SIGN
    d0 Lu  Ð  LATIN CAPITAL LETTER ETH
   e59 Nd  ๙  THAI DIGIT NINE
  2887 So  ⢇  BRAILLE PATTERN DOTS-1238
  bc13 Lo  밓  HANGUL SYLLABLE MIH
  ffeb Sm  →  HALFWIDTH RIGHTWARDS ARROW

我的 Anaconda Python 3.5 有 unicode 8.0,我推测大多数 3 都有。

解决方案 5:

打开的文件codecs.open是一个文件,它接受unicode数据,对数据进行编码iso-8859-1,然后将其写入文件。但是,您尝试写入的内容不是unicode;您自己unicode接受数据并将其编码。这就是该方法的作用,对unicode字符串进行编码的结果是一个字节串(一种类型)。iso-8859-1 unicode.encode`str`

您应该使用正常方式open()并自行对 unicode 进行编码,或者(通常是更好的想法)使用codecs.open()而不自行对数据进行编码。

解决方案 6:

如何将unicode字符打印到文件中:

将其保存到文件:foo.py:

#!/usr/bin/python -tt
# -*- coding: utf-8 -*-
import codecs
import sys 
UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)
print(u'e with obfuscation: é')

运行它并将输出传输到文件:

python foo.py > tmp.txt

打开 tmp.txt 并查看里面,你会看到以下内容:

el@apollo:~$ cat tmp.txt 
e with obfuscation: é

这样,您就将带有混淆标记的unicode e保存到了文件中。

解决方案 7:

当您尝试对非 Unicode 字符串进行编码时,就会出现此错误:它会尝试对其进行解码,假设它是纯 ASCII。有两种可能性:

  1. 您正在将其编码为字节串,但由于您使用了 codecs.open,因此 write 方法需要一个 unicode 对象。因此,您对其进行编码,然后它尝试再次对其进行解码。请尝试:f.write(all_html)

  2. 事实上,all_html 并不是一个 unicode 对象。当你这样做时.encode(...),它首先尝试对其进行解码。

解决方案 8:

如果用 python3 编写

>>> a = u'bats/u00E0'
>>> print a
batsà
>>> f = open("/tmp/test", "w")
>>> f.write(a)
>>> f.close()
>>> data = open("/tmp/test").read()
>>> data
'batsà'

如果用python2编写:

>>> a = u'bats/u00E0'
>>> f = open("/tmp/test", "w")
>>> f.write(a)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'xe0' in position 4: ordinal not in range(128)

为了避免此错误,您必须使用编解码器“utf-8”将其编码为字节,如下所示:

>>> f.write(a.encode("utf-8"))
>>> f.close()

并在读取时使用编解码器“utf-8”解码数据:

>>> data = open("/tmp/test").read()
>>> data.decode("utf-8")
u'batsxe0'

而且如果你尝试在这个字符串上执行打印,它将自动使用“utf-8”编解码器进行解码,如下所示

>>> print a
batsà
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用