从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,请尝试以下方法之一:
-
如果你只是想处理一些特殊情况,比如这个特殊的例子,用ASCII等价物replace特定的Unicode字符
-
使用
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