在Python中读取具有英语和阿拉伯语文本的文本文件

时间:2015-07-02 00:09:32

标签: python python-3.x encoding

我正在尝试阅读包含Instagram公开发布图片及其元数据的文本文件。每行都有一个完整的帖子及其所有元数据。图像帖子的某些部分是用阿拉伯语写的。当我使用Python读取文件时,但打印行后阿拉伯语文本没有显示。 阿拉伯文字显示为等等\ xd9 \ x8a \ xd8

这是我用来从.txt文件中读取的代码

 test_file = codecs.open('instagram_info.txt', mode='r', encoding='utf-8')
 print ("reading  images URLs file")
 counter = 0
 for line in test_file:
     print("Line: ", line.encode("utf-8"))
     counter += 1
     print(counter)
     if counter == 50:
     break
test_file.close()

这是文本文件

中的一个行示例
100158441   25.256887893    51.507485363    Centerpoint 4f09c7a6e4b090ef234993e3               http://scontent.cdninstagram.com/hphotos-xpa1/outbound-distilleryimage9/t0.0-17/OBPTH/9ecde7ecac7811e3b87a12bcaa646ac5_8.jpg sarrah80    25.256887893    51.507485363    2014-03-15 19:37:45 1394912265  16144       ولا راضي يوقف يم الارنوب عشان اصوره dody_nasser said "هههه اكيد خايف الجبان "  nassersahim said "@sarrah80 يبغي يملغ عليكم"  sarrah80 said "@dody_nasser بطل ولدي بس خبرج المود ومايسوي"  sarrah80 said "@nassersahim انت شفت الأرنب شلون يطالعه ذبحني من الضحك "  arwa9009 said "حياتي"  fatimaaljasssim said "حياتتتتتتتنتتي عليهم فديتهم"  6   non_al3yooon,mun.mun_almalki,__manoor__,monaalalii  46

此外,当前代码添加“b”作为每个读取行的前缀,不知道为什么会发生这种情况?

3 个答案:

答案 0 :(得分:1)

  1. Python 3自然支持unicode。您不需要codecs.openopen将有效。
  2. .encode是导致它变成这个的原因:\ xd9 \ x8a \ xd8。您可以删除该函数调用。 print("Line: ", line)

答案 1 :(得分:0)

问题不在于阅读文本。问题出在print()上。您的控制台可能无法使用unicode文本。尝试将结果写入文件,并使用支持unicode的文本编辑器查看内部。

首先,按照NightShadeQueen的建议。然后尝试将行复制到另一个文件以检查:

#!python3
with open('instagram_info.txt', mode='r', encoding='utf-8') as fin, \
     open('output.txt', 'w', encoding='utf-8') as fout:
    for n, line in enumerate(fin, 1):
        fout.write(line)
        if n == 50:
            break

了解自动关闭文件对象的with构造。 enumerate()会自动计算您的行数。使用此代码并将您的示例存储在UTF-8中的instagram_info.txt中,您应该得到相同的output.txt(前50行)。

然后尝试在同一案例中使用print()的第二个示例。请注意end=''中的print - 它会自动添加换行符,因为换行符是line的一部分。

#!python3
with open('instagram_info.txt', encoding='utf-8') as f:
    for n, line in enumerate(f, 1):
        print(line, end='')
        if n == 50:
            break

如果您使用的是Windows,请转到cmd窗口并尝试使用

切换编码
c:\...\>chcp 65001

再次运行Python脚本。控制台仍然可能无法显示所有字符(控制台相当笨)。在某些Python GUI窗口中显示文本可能更容易。

答案 2 :(得分:0)

不要对线路进行编码;直接打印Unicode文本:

#!/usr/bin/env python3
from itertools import islice

with open('instagram_info.txt', encoding='utf-8-sig') as file:
    print("reading  images URLs file")
    for line in islice(file, 50): # read no more than 50 lines from the file
        print("Line: ", line, end='')