使用Python在文本文件中计算字符串出现的次数

3

我是Python的初学者。我试图在一个文本文件(一个字符串)中计算特定字符的数量。我设法读取该文件,并使用for循环尝试循环遍历文本文件中的每一行并查找特定字符。目标是打印出该字符的计数。不幸的是,虽然文件中有几个该字符,但结果为0。

in_file= open("file_x.txt")
lines = in_file.readlines()

d=0

for line in in_file:
    if d in line:
        d=d+1
print(d)

有什么建议吗?谢谢。

1
如果d在一行中:在此处,d是您之前声明的整数变量。请使用“'d'”。 - sittsering
1
此外,你的循环应该遍历每一行,而不是遍历 in_file - cadolphs
1
for line in in_file: d+=line.count('d') - sittsering
如果您正在计数的字符可以在同一行上出现多次,则您的计数方式将会忽略它。 - PM 77-1
或者 for line in in_file: for i in line: if i=='d': d+=1 - sittsering
3个回答

4

你有几个问题。

首先,在读取文件时,你应该指定模式(这不是必需的,但可以大大帮助澄清意图)。在这种情况下,为了读取,请执行以下操作:

open("file_x.txt", "r")

接下来,在读取文件时,您需要确保在完成后关闭它。您应该使用with来实现:

with open("file_x.txt", "r") as in_file:
    lines = in_file.readlines()

您没有循环输出行,而是循环读取已经打开的文件in_file。请改为:

for line in lines:

您没有使用字符串来检查该行,而是使用了变量 d ,它是一个整数 0 。请更改为"d"
if "d" in line:

现在大家一起:

with open("file_x.txt", "r") as in_file:
    lines = in_file.readlines()

d = 0

for line in lines:
    if "d" in line:
        d += 1

print(d)

另一个错误。如果你想要计算所有出现的次数而不仅仅是包含该字母的行数,你需要使用str.count。此外,如果你直接循环读取文件,就可以避免调用readline

d = 0
with open("file_x.txt", "r") as in_file:
    for line in in_file:
        d += line.count("d")

print(d)

使用sum函数和生成器表达式可以进一步简化:

with open("file_x.txt", "r") as in_file:
    d = sum(line.count("d") for line in in_file)

print(d)

使用默认模式真的是一个错误吗?如果是,为什么还要存在默认模式呢? - no comment
@don'ttalkjustcode 我猜这不是一个错误,但我见过很多人因为忘记了那个而导致了很多错误。各有所好。 - flakes
谢谢。如果我有更多的字符要搜索,我可以使用生成器表达式吗?例如,如果我有a、b、c、d等字符,我想要计算它们的数量。 - Endre

1
你需要使用单独的变量来计数出现次数,并循环遍历lines而不是in_file
我添加了另一个循环来计算每行中确切的出现次数,因为if 'd' in line无法包括一行中出现次数超过1的总数。
in_file= open("file_x.txt")
lines = in_file.readlines()

count = 0
key = 'd'

for line in lines:
    for j in line:
        if j == key:
            count+=1

print(count)


0
如果你关心效率,我建议在生成器函数内生成每一行。
def gen_lines():
    with open("file_x.txt", "r") as in_file:
        for line in in_file:
            yield line 

然后你可以使用列表推导式在一行中计算它。

elements = sum[line.count("d") for line in gen_lines()]

我发现在生成器内部打开文件是有风险的,因为无法保证生成器对象的使用者会到达StopIteration异常,这将关闭您的文件句柄。考虑示例any(gen_lines())。这将在第一行停止而不关闭文件。您应该在方法外部打开文件并将其传递给gen_lines。尽管in_file本身已经可以按行迭代,所以没有必要这样做。 - flakes
另外,如果您确实想要这样做,更简洁的方法是使用 yield from 并编写 yield from in_file - flakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接