0

我可以读取整个字符串,但不计算单个字符。

这是我所拥有的:

#!/usr/bin/python2.7

ans = True

while ans:
    print("""
    1. Read in an text file.

    Press enter to exit
    """)

    ans=raw_input("Make a selection")

    if ans == "1":

        print("Enter in a text file to open")
        txt = raw_input("> ")
        txt_open = open(txt, 'r')

        d = dict()
        for c in txt_open:
            if c not in d:
                d[c] = 1
            else:
                d[c] += 1

        print d
4

3 回答 3

2

问题是文件是可迭代的,而不是字符。所以,在这个:

for c in txt_open:

每一个c都是一整行。如果您想要行中的每个字符,请添加另一个循环:

for line in txt_open:
    for c in line:

或者,如果您愿意,您可以read将整个文件放入一个大字符串并遍历其字符(但请记住,这意味着您需要将整个文件放入内存中,并且您需要先读取整个文件才能读取处理其中任何一个):

for c in txt_open.read():

将来,当您遇到此类问题时,第一步应该是查看您获得的值。您可以使用调试器或实时可视化工具,也可以只print在代码中添加语句。例如,如果你们print每个c人,它会立即很明显出了什么问题。


同时,您正在构建的内容已经存在于 stdlib as 中Counter,因此您可以使用它:

d = collections.Counter()
for line in txt_open:
    for c in line:
        d[c] += 1

……或者,更简单地说:

d = collections.Counter()
for line in txt_open:
    d.update(line)

……或者,简单地说:

d = collections.Counter(c for line in txt_open for c in line)

……或者,如果您愿意:

d = collections.Counter(txt_open.read())
于 2013-11-01T00:41:34.670 回答
0

您需要为每一行添加另一个 for 循环以到达每个字符:

for line in txt_open:
    for c in line:
        if c not in d:
            d[c] = 1
        else:
            d[c] += 1

print d
于 2013-11-01T00:42:53.153 回答
0
dict_ = collections.defaultdict(int)

with open(filename, 'r') as file_:
   for line in file_:
      for character in line:
         dict_[character] += 1

高温高压

于 2013-11-01T00:39:35.083 回答