2015-10-24 2 views
3

Я выполняю некоторые задачи обработки на среднем (1.7 Мб) Персидский текст corpus. Я хочу, чтобы сделать списки три набора символов в тексте:Python3: подсчет и извлечение букв из текста

  1. алфавитов
  2. белые пространства (включая символ новой строки, табуляция, пробел, не разорвать пространство и т.д.) и
  3. пунктуации. я писал:

# -*- coding: utf8 -*- 
TextObj = open ('text.txt', 'r', encoding = 'UTF8') 
import string 
LCh = LSpc = LPunct = [] 
TotalCh = TotalPunct = TotalSpc = 0 
TempSet = 'ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی' 
#TempSet variable holds alphabets of Persian language. 
ReadObj = TextObj.read() 
for Char in ReadObj: 
    if Char in TempSet: #This's supposed to count & extract alphabets only. 
     TotalCh += 1 
     LCh.append (Char) 
    elif Char in string.punctuation: #This's supposed to count puncts. 
     TotalPunct += 1 
     LPunct.append (Char) 
    elif Char in ('', '\n', '\t'): #This counts & extracts spacey things. 
     TotalSpc += 1 
     LSpc.append (Char) 
    else: #This'll ignore anything else. 
     continue 

Но когда я пытаюсь:

print (LPunct) 
print (LSpc) 

Я попробовал этот код на обоих Linux и Windows 7. На обоих из них, результат не то, что Я ожидал вообще. Списки пунктуации и пробела содержат как персидские буквы.

Другой вопрос:

Как я могу улучшить это состояние elif Char in ('', '\n', '\t'): так, что она охватывает все виды космической семьи?

+0

Любой новый код opf? – Vynylyn

ответ

1

В строке 3 вы назначили все списки одним и тем же списком!

Не делайте этого:

LCh = LSpc = LPunct = [] 

ли это:.

LCh = [] 
LSpc = [] 
LPunct = [] 

string класс пробельные построен в

elif Char in string.whitespace: 
    TotalSpc += 1 
    LSpc.append (Char) 

В вашем примере вы фактически не введите пробел в свой символ '', который также может привести к его сбою. Разве это не должно быть ' '?

Также учтите другой ответ здесь, этот код не очень питоновский.

Я бы написал так:

# -*- coding: utf8 -*- 
import fileinput 
import string 
persian_chars = 'ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی' 
filename = 'text.txt' 
persian_list = [] 
punctuation_list = [] 
whitespace_list = [] 
ignored_list = [] 

for line in fileinput.input(filename): 
    for ch in line: 
     if ch in persian_chars: 
      persian_list.append(ch) 
     elif ch in string.punctuation: 
      punctuation_list.append(ch) 
     elif ch in string.whitespace: 
      whitespace_list.append(ch) 
     else: 
      ignored_list.append(ch) 

total_persian, total_punctuation, total_whitepsace = \ 
    map(len, [persian_list, punctuation_list, whitespace_list]) 
+0

В моем фактическом коде это '', но здесь я ошибаюсь, чтобы ввести ''. Спасибо, что упомянул.Этот класс также поддерживает раздражающий символ пробега utf «\ u200c»? – Vynylyn

+0

Я изменил свой код так же, как ваш. Нет изменений в выходе. – Vynylyn

+0

Зачем стоит открывать/закрывать файл три раза? Разве мы не можем сделать это только в одном блоке 'with'? – Vynylyn

0

Прежде всего, как более вещий способ для работы с файлами лучше использовать with заявление для открытия файлов, которые будут закрывать файл в конце блок.

Во-вторых, поскольку вы хотите подсчитать количество специальных символов в тексте и сохранить их отдельно, вы можете использовать словарь с именами списков в качестве ключей и относительных символов в списке как значение. Затем используйте метод len, чтобы получить длину.

И, наконец, для проверки членства в пробелах вы можете использовать метод string.whitespace.

import string 
TempSet = 'ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی' 
result_dict={} 
with open ('text.txt', 'r', encoding = 'UTF8') as TextObj : 
    ReadObj = TextObj.read() 
    for ch in ReadObj : 
     if Char in TempSet: 
      result_dict['TempSet'].append(ch) 
     elif Char in string.punctuation: 
      result_dict['LPunct'].append(ch) 
     elif Char in string.whitespace: 
      result_dict['LSpc'].append(ch) 

TotalCh =len(result_dict['LSpc']) 
+0

Хорошо, позвольте мне рассмотреть его. – Vynylyn

+0

Это плохо, вы читаете файл три раза, когда этого будет достаточно. –

+0

@ Kasramvd Когда я попробовал свой исходный код, я получил эту ошибку: 'Char не определен.' Поэтому я изменил 'Char'to' ch'. Теперь вывод для LPunct и LSpc - это два пустых списка: [] [] – Vynylyn

Смежные вопросы