2016-05-03 13 views
0

Что мой код делает, он подсчитывает количество раз, когда письмо появилось и отсчитывает его до уважаемого письма. Поэтому, если A появляется два раза, он будет показывать 2: A. Моя проблема в том, что я хочу, чтобы он читал из файла и когда ord() пытается, он не может. Я не знаю, как обойти это.Получение ord() для чтения из файла

t=open('lettersTEst.txt','r') 
tList=[0]*26 
aL=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 

idx=0 


for char in t: 
    ch=ord(char) 
    if ch >=65 and ch <= 90: 
     pos=int(ch)-65 
     tList[pos]+=1 

for ele in tList: 
    print(idx, ": ", tList[ch]) 
    idx+=1 
+0

Я надеюсь, что это упражнение. Существует множество строчных букв не в диапазоне 65-90. - Грюссен! (Приветствую! На немецком языке). –

+0

Да, это не так серьезно. Его больше практика на среднесрочную перспективу. – Mell0w

+0

'' '' '' '' '' '' возвращает файл. Что вы * получаете * при переходе по файловому объекту? Попробуйте добавить '' 'print (char)' '' в качестве первой строки в '' '' for'''. – wwii

ответ

3

Когда вы перебираете файл, вы получаете строки. Если вам нужны символы, вам нужно также перебирать каждую строку.

for line in t: 
    for char in line: 
     ch = ord(char) 
     ... 
+0

Вау, я чувствую себя идиотом. Спасибо! – Mell0w

3

Вы должны петлю над indivdual символов каждой строки файла, и вы могли бы использовать Counter вместо массива.

И если вы хотите только прописные буквы, то добавьте if char.isupper() перед тем, как добавить к Счетчику.

Пример

>>> from collections import Counter 
>>> c = Counter() 
>>> with open('lettersTEst.txt') as f: 
...  for line in f: 
...   for char in line: 
...    c[char] += 1 
... 
>>> for k,v in c.items(): 
...  print('{}:{}'.format(k,v)) 
... 
a:2 
:4 
e:1 
g:1 
i:3 
h:1 
m:1 
l:1 
n:1 
p:1 
s:4 
r:1 
t:2 
+0

Это не то же самое, что делает OP, хотя они хранят только количество заглавных букв. –

+1

@ TadhgMcDonald-Jensen Конечно. Оператор if может быть добавлен. Следовательно, я сказал * пример * –

1

В то время как я предпочитаю @ ответ JohnKugelman над моей, я хотел бы показать два альтернативных метода перебора каждого символа файла в один цикл

Первый использует вторую форму iter с использованием вызываемого (прочитанного одного символа) и дозорного (продолжайте вызывать функцию до тех пор, пока она не вернет это значение). В этом случае я бы использовал functools.partial для выполнения функции, которая читает один байт:

import functools 

read_a_byte = functools.partial(t.read, 1) 
for char in iter(read_a_byte,''): 
    ch = ord(char) 
    ... 

Второе часто используется для сглаживания двумерных списков, itertools.chain.from_iterable берет то, что итерируется над (файлом), и объединяет каждое сгенерированное значение (каждая строка) вместе на итерации.

import itertools 
char_iterator = itertools.chain.from_iterable(t) 
for char in char_iterator: 
    ch = ord(char) 
    ... 

Тогда вы могли бы передать либо collections.Counter построить основной счетчик, но он не будет следовать той же логике, вы применили с ord:

read_a_byte = functools.partial(t.read, 1) 
c = collections.Counter(iter(read_a_byte,'')) 

>>> pprint.pprint(dict(c)) 
{'a': 8, 
'b': 2, 
'c': 9, 
'd': 4, 
'e': 11, 
...} 

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

  • Нет связанных вопросов^_^