从Python中的文件读取字符

在一个文本文件中,有一个string“我不喜欢这个”。

但是,当我将它读入一个string时,它变成了“我不喜欢这样”。 我明白,“是”的Unicode代表。 我用

f1 = open (file1, "r") text = f1.read() 

命令做阅读。

现在,读取string是不是可以这样读取string:“我不喜欢这个”,而不是像这样的“我不喜欢这个”?

二,编辑:我看过一些人用映射来解决这个问题,但是真的,有没有内置的转换来做这种ANSI到unicode(反之亦然)的转换呢?

参考: http : //docs.python.org/howto/unicode

从文件读取Unicode因此很简单:

 import codecs f = codecs.open('unicode.rst', encoding='utf-8') for line in f: print repr(line) 

也可以在更新模式下打开文件,允许读取和写入:

 f = codecs.open('test', encoding='utf-8', mode='w+') f.write(u'\u4500 blah blah blah\n') f.seek(0) print repr(f.readline()[:1]) f.close() 

编辑 :我假设你的预期目标只是能够正确地将文件读入Python中的string。 如果您试图从Unicode转换为ASCIIstring,那么确实没有直接的方法,因为Unicode字符不一定以ASCII存在。

如果您尝试转换为ASCIIstring,请尝试以下方法之一:

  1. 如果你只是想处理一些特殊情况,比如这个特殊的例子,用ASCII等价物replace特定的Unicode字符

  2. 使用unicodedata模块的normalize()string.encode()方法尽可能地转换为下一个最接近的ASCII等效(参考https://web.archive.org/web/20090228203858/http://techxplorer.com / 2006/07/18 /转换 – unicode-to-ascii-using-python ):

     >>> teststr u'I don\xe2\x80\x98t like this' >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore') 'I donat like this' 

有几点要考虑。

一个字符可能只出现在Python中一个表示unicodestring的片段,例如,如果你写:

 >>> text = u''' >>> print repr(text) u'\u2018' 

现在,如果您只是想打印unicodestring,只需使用unicode的encode方法:

 >>> text = u'I don\u2018t like this' >>> print text.encode('utf-8') I don't like this 

为了确保任何文件的每一行都被读为unicode,最好使用codecs.open函数而不是只open ,这样就可以指定文件的编码:

 >>> import codecs >>> f1 = codecs.open(file1, "r", "utf-8") >>> text = f1.read() >>> print type(text) <type 'unicode'> >>> print text.encode('utf-8') I don't like this 

但它确实是“我不喜欢这个”而不是“我不喜欢这个”。 u'\ u2018'这个字符与''“是完全不同的字符(而且在视觉上应该更多地与'`'相对应)。

如果您要将编码的Unicode转换为纯ASCII,则可以保留您想要转换为ASCII的Unicode标点的映射。

 punctuation = { u'\u2018': "'", u'\u2019': "'", } for src, dest in punctuation.iteritems(): text = text.replace(src, dest) 

然而, 在unicode中有很多标点字符 ,但是我想你可以指望其中的一小部分被任何应用程序创build你正在阅读的文档所使用。

撇开你的文本文件被破坏的事实(U + 2018是一个左引号,而不是撇号):iconv可以用于音译unicode字符为ascii。

你必须谷歌“iconvcodec”,因为该模块似乎不再受支持,我无法find它的规范主页。

 >>> import iconvcodec >>> from locale import setlocale, LC_ALL >>> setlocale(LC_ALL, '') >>> u'\u2018'.encode('ascii//translit') "'" 

或者,您可以使用iconv命令行实用程序来清理文件:

 $ xxd foo 0000000: e280 980a .... $ iconv -t 'ascii//translit' foo | xxd 0000000: 270a '. 

有一种可能性,你有一个unicode转义字符的非Unicodestring,例如:

 >>> print repr(text) 'I don\\u2018t like this' 

这实际上发生在我之前的一次。 您可以使用unicode_escape编解码器将string解码为unicode,然后将其编码为任何您想要的格式:

 >>> uni = text.decode('unicode_escape') >>> print type(uni) <type 'unicode'> >>> print uni.encode('utf-8') I don't like this 

实际上,U + 2018是特殊字符的Unicode表示forms。 如果你愿意,你可以用这个代码把这个字符的实例转换成U + 0027:

 text = text.replace (u"\u2018", "'") 

另外,你用什么来写文件? f1.read()应该返回一个如下所示的string:

 'I don\xe2\x80\x98t like this' 

如果它返回这个string,则文件写入不正确:

 'I don\u2018t like this' 

这是Pythons的方式做你的unicode编码的string。 但我认为你应该能够在屏幕上打印string或将其写入一个新的文件没有任何问题。

 >>> test = u"I don\u2018t like this" >>> test u'I don\u2018t like this' >>> print test I don't like this