我从谷歌文档中提取数据,处理它,并将其写入文件(最终我将粘贴到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"))

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

'ascii'编解码器不能解码字节0xa0在位置 12286:序数不在范围(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 

也许我需要写一些东西,而不是一个文本文件?


当前回答

前言:你的查看器能工作吗?

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

将Unicode文本写入文本文件?

在Python 2中,使用io模块中的open(这与Python 3中内置的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}\n'.format(x, cat, uname))
        else:
            f.write(u'{0:>6x} {1}  {2}  {3}\n'.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

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

我建议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都会。

其他回答

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

import io

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

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

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

char已经存储在内存中的Unicode(32位)中 您只需要以utf-8格式打开文件 (32位Unicode到可变字节长度utf-8的转换将自动从内存执行到文件。) Out1 = "(嘉南大圳ㄐㄧㄚㄋㄢˊㄉㄚˋㄗㄨㄣˋ)" Fobj = open("t1.txt", "w", encoding="utf-8") fobj.write(着干活) fobj.close ()

前言:你的查看器能工作吗?

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

将Unicode文本写入文本文件?

在Python 2中,使用io模块中的open(这与Python 3中内置的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}\n'.format(x, cat, uname))
        else:
            f.write(u'{0:>6x} {1}  {2}  {3}\n'.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

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

我建议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都会。

如何将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保存到文件中。

尽可能只处理unicode对象,方法是在第一次获得对象时将其解码为unicode对象,然后在返回时根据需要对其进行编码。

如果你的字符串实际上是一个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')