如何使用Python将文件格式从Unicode转换为ASCII?

时间:2008-10-06 17:11:30

标签: python unicode encoding file ascii

我使用第三方工具输出Unicode格式的文件。但是,我更喜欢它是ASCII。该工具没有更改文件格式的设置。

使用Python转换整个文件格式的最佳方法是什么?

8 个答案:

答案 0 :(得分:44)

您可以使用unicode函数轻松转换文件,但是如果没有直接的ASCII等效字符,您将遇到Unicode字符问题。

This blog建议使用unicodedata 模块,该模块似乎负责粗略转换没有直接对应ASCII值的字符,例如

>>> title = u"Klüft skräms inför på fédéral électoral große"

通常会转换为

Klft skrms infr p fdral lectoral groe

这是非常错误的。但是,使用unicodedata模块,结果可能更接近原始文本:

>>> import unicodedata
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'

答案 1 :(得分:11)

我认为这是一个比你意识到的更深层次的问题。简单地将文件从Unicode更改为ASCII很容易,但是,将所有Unicode字符转换为合理的ASCII字符(两种编码中都没有多个字母)是另一种。

这个Python Unicode教程可以让您更好地了解转换为ASCII的Unicode字符串会发生什么:http://www.reportlab.com/i18n/python_unicode_tutorial.html

以下是该网站的有用引用:

  

Python 1.6也获得了“unicode”   内置功能,你可以   指定编码:

> >>> unicode('hello') u'hello'
> >>> unicode('hello', 'ascii') u'hello'
> >>> unicode('hello', 'iso-8859-1') u'hello'
> >>>
  

所有这三个都返回相同   事情,因为'你好'中的人物   这三种编码都很常见。

     

现在让我们用a编码   欧洲口音,在外面   ASCII。你在控制台上看到的可能是什么   取决于您的操作系统   区域; Windows让我输入   ISO-Latin-1的

> >>> a = unicode('André','latin-1')
> >>> a u'Andr\202'
  

如果你不能输入急性字母e,   你可以输入字符串'Andr \ 202',   这是明确的。

     

Unicode支持所有常见的   迭代和。等操作   分裂。我们不会掠夺他们   这里。

答案 2 :(得分:3)

顺便说一句,这些是一个linux命令iconv来做这种工作。

iconv -f utf8 -t ascii <input.txt >output.txt

答案 3 :(得分:2)

像这样:

uc = open(filename).read().decode('utf8')
ascii = uc.decode('ascii')

但请注意,如果有任何字符无法转换为ASCII,则失败会出现UnicodeDecodeError异常。

编辑:正如Pete Karl刚才指出的那样,没有从Unicode到ASCII的一对一映射。因此,某些字符无法以信息保存的方式进行转换。此外,标准ASCII或多或少是UTF-8的一个子集,因此您甚至不需要进行任何解码。

答案 4 :(得分:2)

这是一些简单(和愚蠢)的代码来进行编码转换。我假设(但你不应该)输入文件是UTF-16(Windows称之为'Unicode')。

input_codec = 'UTF-16'
output_codec = 'ASCII'

unicode_file = open('filename')
unicode_data = unicode_file.read().decode(input_codec)
ascii_file = open('new filename', 'w')
ascii_file.write(unicode_data.write(unicode_data.encode(output_codec)))

请注意,如果Unicode文件中的任何字符也不是ASCII字符,则此操作无效。您可以执行以下操作将无法识别的字符转换为'?':

ascii_file.write(unicode_data.write(unicode_data.encode(output_codec, 'replace')))

查看the docs以获得更简单的选择。如果您需要做更复杂的事情,您可以在Python Cookbook上查看The UNICODE Hammer

答案 5 :(得分:2)

对于我的问题,我只想跳过非ascii字符,只输出ascii输出,下面的解决方案效果很好:

    import unicodedata
    input = open(filename).read().decode('UTF-16')
    output = unicodedata.normalize('NFKD', input).encode('ASCII', 'ignore')

答案 6 :(得分:0)

重要的是要注意,没有'Unicode'文件格式。 Unicode可以通过几种不同的方式编码为字节。最常见的是UTF-8或UTF-16。您需要知道第三方工具输出的是哪一个。一旦你知道,在不同的编码之间进行转换非常简单:

in_file = open("myfile.txt", "rb")
out_file = open("mynewfile.txt", "wb")

in_byte_string = in_file.read()
unicode_string = bytestring.decode('UTF-16')
out_byte_string = unicode_string.encode('ASCII')

out_file.write(out_byte_string)
out_file.close()

如其他回复中所述,您可能希望为encode方法提供错误处理程序。使用'replace'作为错误处理程序很简单,但如果文本包含无法用ASCII表示的字符,则会破坏文本。

答案 7 :(得分:0)

正如其他海报所述,ASCII是unicode的子集。

但是如果你:

  • 有一个遗留应用
  • 您无法控制该应用的代码
  • 您确定您的输入属于ASCII子集

然后下面的例子展示了如何做到这一点:

mystring = u'bar'
type(mystring)
    <type 'unicode'>

myasciistring = (mystring.encode('ASCII'))
type(myasciistring)
    <type 'str'>