我想获取文件的路径,打开文件并读取其中的数据。这样做,我想计算字母表中每个字母的出现次数。
在我所阅读和听到的内容中,使用try / except将是最好的。我已经尽力了,但我只计算了程序中字符串中字母的出现次数,而不是文件中的字符。
我现在还不知道如何做到这一点,我的大脑开始受伤......这就是我到目前为止所做的:
import sys
print "Enter the file path:"
thefile = raw_input()
f = open(thefile, "r")
chars = {}
for c in f:
try:
chars[c]+=1
except:
chars[c]=1
print chars
任何帮助都将受到高度赞赏。谢谢。
编辑:我忘了说我得到的结果说整个文件是一个字符。该文件由“abcdefghijklmnopqrstuvwxyz”组成,结果输出为:{'“abcdefghijklmnopqrstuvwxyz”\ n':1}它不应该是。答案 0 :(得分:4)
这是一种稍微优雅的方法:
from __future__ import with_statement
from collections import defaultdict
print "Enter the file path:"
thefile = raw_input()
with open(thefile, "r") as f:
chars = defaultdict(int)
for line in f:
for c in line:
chars[c] += 1
print dict(chars)
这使用defaultdict
来简化计数过程,使用两个循环来确保我们单独读取每个字符而无需将整个文件读入内存,并使用with
块来确保文件正确关闭。
修改强>:
要计算字母的直方图,您可以使用以下版本:
from __future__ import with_statement
from string import ascii_letters
print "Enter the file path:"
thefile = raw_input()
chars = dict(zip(ascii_letters, [0] * len(ascii_letters)))
with open(thefile, "r") as f:
for line in f:
for c in line:
if c in ascii_letters:
chars[c] += 1
for c in ascii_letters:
print "%s: %d" % (c, chars[c])
这使用了方便的string.ascii_letters
常量,并显示了使用zip()
构建空字典的简洁方法。
答案 1 :(得分:1)
for c in f:
语句逐行处理您的文件(这是文件对象上的for
操作设计要执行的操作)。由于您希望逐个字符地处理它,请尝试将其更改为:
data = f.read()
for c in data:
.read()
方法将文件的全部内容读入一个字符串,将其分配给data
,然后for
循环会考虑每个字符那个字符串。
答案 2 :(得分:1)
c
不是一个字符,而是一条线:迭代Python文件一次给你一行。您可以通过添加另一个循环来解决问题:
print "Enter the file path:"
thefile = raw_input()
f = open(thefile, "r")
chars = {}
for line in f:
for c in line:
try:
chars[c]+=1
except:
chars[c]=1
print chars
(将整个文件读成字符串也有效,如另一个答案所提到的,如果你的文件足够小以适应内存。)
虽然它在这种情况下确实有效,但使用原始except:
并不是一个非常好的主意,除非你真的试图捕获所有可能的错误。相反,请使用except KeyError:
。
您尝试做的事情很常见,因此有一种Python字典方法和数据类型可以完全从代码中删除try/except
。请查看the setdefault
method和the defaultdict
type。使用其中任何一个,您基本上可以指定缺失值从0开始。
答案 3 :(得分:0)
让我们为PEP8提供更多的pythonic方式:
import collections
with open(raw_input(), 'rb') as f:
count = collections.Counter(f.read())
print count
包括电池! :)