2015-07-02 95 views
2

我想讀取一個文本文件,該文件具有Instagram公開發布的圖像及其元數據。每行都有一個完整的帖子以及所有的元數據。圖片文章的某些部分用阿拉伯文編寫。當我使用Python讀取文件時,但打印行後不顯示阿拉伯語文本。 阿拉伯文字顯示爲等\ xd9 \ x8a \ XD8閱讀Python中具有英文和阿拉伯文本的文本文件

這是代碼剪斷我使用從.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'」添加爲正在讀取的每一行的前綴,任何想法爲什麼會發生這種情況?

回答

1
  1. Python 3自然支持unicode。你不需要codecs.openopen將工作。
  2. .encode是什麼導致它變成這樣:\ xd9 \ x8a \ xd8。您可以刪除該函數調用。 print("Line: ", line)
+0

我想你的提醒@NightShadeQueen,但它給了另一個錯誤見下圖: 回報codecs.charmap_encode(輸入,self.errors,encoding_table)[0] UnicodeEncodeError: '字符映射' 編解碼器不能在位置0編碼字符'\ ufeff':字符映射到

+0

有趣。你確定你的輸入是UTF-8而不是UTF-16嗎?請參閱:http:// stackoverflow。com/questions/17912307/u-ufeff-in-python-string – NightShadeQueen

+0

是的,文本文件的編碼是UTF-8 @NightShadeQueen, –

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()在相同情況下的第二個示例。注意print中的end='' - 它禁止自動添加換行符,因爲換行符是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窗口中顯示文本可能更容易。

+1

不使用'chcp 65001'。要將任意文本打印到Windows控制檯,請使用[win-unicode-console'包](http://stackoverflow.com/a/30551552/4279) – jfs

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='') 
相關問題