我是一名初学python程序员,我正在尝试制作一个计算文本文件中字母数量的程序。这是我到目前为止所得到的:
import string
text = open('text.txt')
letters = string.ascii_lowercase
for i in text:
text_lower = i.lower()
text_nospace = text_lower.replace(" ", "")
text_nopunctuation = text_nospace.strip(string.punctuation)
for a in letters:
if a in text_nopunctuation:
num = text_nopunctuation.count(a)
print(a, num)
如果文本文件包含hello bob
,我希望输出为:
b 2
e 1
h 1
l 2
o 2
我的问题是,当文本文件包含多行文本或标点符号时,它无法正常工作。
答案 0 :(得分:10)
这是使用Counter完成您想要的内容的可读方式:
from string import ascii_lowercase
from collections import Counter
with open('text.txt') as f:
print Counter(letter for line in f
for letter in line.lower()
if letter in ascii_lowercase)
您可以迭代生成的dict,以您想要的格式打印它。
答案 1 :(得分:1)
您必须使用collections.Counter
from collections import Counter
text = 'aaaaabbbbbccccc'
c = Counter(text)
print c
打印:
Counter({'a': 5, 'c': 5, 'b': 5})
您的text
变量应为:
import string
text = open('text.txt').read()
# Filter all characters that are not letters.
text = filter(lambda x: x in string.letters, text.lower())
获取所需的输出:
for letter, repetitions in c.iteritems():
print letter, repetitions
在我的例子中,它打印:
a 5
c 5
b 5
了解更多信息Counters doc
答案 2 :(得分:1)
使用re:
import re
context, m = 'some file to search or text', {}
letters = ['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']
for i in range(len(letters)):
m[letters[i]] = len(re.findall('{0}'.format(letters[i]), context))
print '{0} -> {1}'.format(letters[i], m[letters[i]])
尽管如此,它还是更加优雅和干净。
答案 3 :(得分:1)
import string
fp=open('text.txt','r')
file_list=fp.readlines()
print file_list
freqs = {}
for line in file_list:
line = filter(lambda x: x in string.letters, line.lower())
for char in line:
if char in freqs:
freqs[char] += 1
else:
freqs[char] = 1
print freqs
答案 4 :(得分:1)
仅仅为了完整起见,如果你想在不使用Counter
的情况下这样做,这是另一种非常简短的方法,使用列表理解和dict
内置:
from string import ascii_lowercase as letters
with open("text.txt") as f:
text = f.read().lower()
print dict((l, text.count(l)) for l in letters)
f.read()
会将整个文件的内容读入text
变量(如果文件非常大,可能是个坏主意);然后我们使用列表推导来创建元组列表(letter, count in text)
并将这个元组列表转换为字典。使用Python 2.7+,您还可以使用{l: text.count(l) for l in letters}
,它更短,更具可读性。
但请注意,这将多次搜索文本,每个字母一次,而Counter
只扫描一次,并一次更新所有字母的计数。
答案 5 :(得分:0)
您可以将问题分成两个更简单的任务:
#!/usr/bin/env python
import fileinput # accept input from stdin and/or files specified at command-line
from collections import Counter
from itertools import chain
from string import ascii_lowercase
# 1. count frequencies of all characters (bytes on Python 2)
freq = Counter(chain.from_iterable(fileinput.input())) # read one line at a time
# 2. print frequencies of ascii letters
for c in ascii_lowercase:
n = freq[c] + freq[c.upper()] # merge lower- and upper-case occurrences
if n != 0:
print(c, n)
答案 6 :(得分:0)
另一种方式:
import sys
from collections import defaultdict
read_chunk_size = 65536
freq = defaultdict(int)
for c in sys.stdin.read(read_chunk_size):
freq[ord(c.lower())] += 1
for symbol, count in sorted(freq.items(), key=lambda kv: kv[1], reverse=True):
print(chr(symbol), count)
它输出频率最高的符号到最小的符号。
字符计数循环的复杂度为O(1),并且可以处理read_chunk_size
块中的文件,因此可以处理任意大文件。
答案 7 :(得分:-1)
import sys
def main():
try:
fileCountAllLetters = file(sys.argv[1], 'r')
print "Count all your letters: ", len(fileCountAllLetters.read())
except IndexError:
print "You forget add file in argument!"
except IOError:
print "File like this not your folder!"
main()
python file.py countlettersfile.txt