获取 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,
...}
我的代码所做的是计算字母出现的次数并将其计入受尊重的字母。所以如果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,
...}