当我用Python中的utf-8文件打印文本时,为什么我看不到希伯来字符呢?

时间:2011-07-21 10:04:00

标签: python encoding printing

我正在尝试从文本文件中读取希伯来语:

def task1():
    f = open('C:\\Users\\royi\\Desktop\\final project\\corpus-haaretz.txt', 'r',"utf-8")
    print 'success'
    return f

a = task1()

当我阅读它时它向我显示:

'[\xee\xe0\xee\xf8 \xee\xf2\xf8\xeb\xfa \xf9\xec \xe4\xf0\xe9\xe5-\xe9\xe5\xf8\xf7 \xe8\xe9\xe9\xee\xf1: \xf2\xec \xe1\xe9\xfa \xe4\xee\xf9\xf4\xe8 \xec\xe1\xe8\xec \xe0\xfa \xe7\xe5\xf7 \xe4\xe7\xf8\xed, \xec\xe8\xe5\xe1\xfa \xe9\xf9\xf8\xe0\xec \xee\xe0\xfa \xf0\xe9\xe5 

还有更多。

我怎么看?

4 个答案:

答案 0 :(得分:5)

你这样打印:

print task1().encode('your terminal encoding here')

您必须确保您的终端能够显示希伯来字符。例如,在安装了希伯来语语言环境的完整utf-8 Linux distrib 下:

print task1().encode('utf-8')

小心open

  • 使用python 2.7,你没有编码参数。使用codecs模块。
  • 使用python 3+,编码参数是第四个,而不是像你这样的第三个。你的意思可能是open(path, 'r', encoding='utf-8')。您甚至可以省略'r'

那你为什么要用encode

好吧,当你读取一个文件并告诉Python编码时,它会返回一个unicode对象,而不是string对象。例如,在我的系统上:

>>> import codecs
>>> content = codecs.open('/etc/fstab', encoding='utf-8').read()
>>> type(content)
<type 'unicode'>
>>> type('')
<type 'str'>
>>> type(u'')
<type 'unicode'>

如果要使其成为可打印的字符串(如果它包含非ascii字符),则需要将其编码回字符串:

>>> type(content.encode('utf-8'))
<type 'str'>

我们使用encode,因为在这里我们讨论的是一个或多或少的通用文本对象(unicode与文本操作一样通用),然后将它(编码)转换为特定的表示形式(utf- 8)。

我们需要这个特定的表示,因为你的系统不关于Python内部,如果你没有指定编码,只能打印ascii字符。因此,当您输出时,您专门编码为您的系统可以理解的编码。对我来说,幸运的是'utf-8',所以很容易。如果你在Windows上,它可能会变得棘手。

答案 1 :(得分:1)

您需要使用codecs module打开文件。 open()(请参阅docs)调用不会采用第三个参数,第三个参数将是bufsize

具体来说是codecs.open()。您在阅读时始终进行解码,输出时进行编码: - )

答案 2 :(得分:1)

从它的外观来看,在我看来,你获得的字符串编码是'windows-1255',而不是'utf-8'。尝试使用该编码打开文件。

答案 3 :(得分:0)

您对如何阅读文件的说明似乎不正确。令人费解的是,“它”设法向您展示显然是在cp1255中编码的希伯来语文本的字节。

我们需要明确地显示 文件的前几个(比如200个)字节中的内容。请在命令提示符窗口中运行以下命令之一,具体取决于您使用的Python:

Python 2.x(假设在标准位置安装了2.7):

prompt>c:\python27\python -c "import locale; print locale.getpreferredencoding(), repr(open('your_file.txt', 'rb').read(200))"

或Python 3.x

prompt>c:\python32\python -c "import locale; print(locale.getpreferredencoding(),ascii(open('your_file.txt', 'rb').read(200)))"

编辑你的问题和(1)复制/粘贴命令的输出(2)告诉我们你使用的是什么版本的Python。