获取 ord() 以从文件中读取

Getting ord() to read from a file

我的代码所做的是计算字母出现的次数并将其计入受尊重的字母。所以如果A出现两次,就会显示2:A。我的问题是我希望它从文件中读取,而当 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

当你遍历一个文件时,你会得到一行。如果你想要字符,你也需要遍历每一行。

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

您需要遍历文件每一行的各个字符,您可以使用 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

虽然我更喜欢@JohnKugelman 的回答而不是我自己的回答,但我想展示两种在单个 for 循环中迭代文件的每个字符的替代方法

第一种是使用iter using a callable (read one character) and a sentinel (keep calling the function until it returns this value) In this case I'd use 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,
 ...}