在一个 .txt 文件中计算数值的连续出现次数

3

我有一个 .txt 文件,其中两个单词在不同的行中重复出现。

这里是一个例子。(实际文件大约有80,000行)

ANS
ANS
ANS
AUT
AUT
AUT
AUT
ANS
ANS
ANS
ANS
ANS

我正在尝试开发一些Python代码来计算连续行并返回它们重复的次数。因此,对于这个示例,我想将[3,4,5]返回到另一个.txt文件中。

word="100011010"
count=1
length=""

for i in range(1, len(word)):

    if word[i-1] == word[i]:
       count += 1

    else:
        length += word[i-1]+" repeats "+str(count)+", "
        count=1

length += ("and "+word[i]+" repeats "+str(count))
print (length)

这个概念与字符串的代码类似。有没有一种方法可以对列表执行此操作?


4
你可以使用完全相同的代码,只需将“word”替换为“your_list”即可 :) - Mr. E
抱歉,我上一个问题表述有误。现在的信息是在一个 .txt 文件中,我需要将其转换为列表吗? - slynes
有没有办法直接从 .txt 文件中读取它?可以从中单独选择某一行吗(例如 word[2])?是否有一种方法可以说出 line[2]? - slynes
@slyness 不确定你的应用是什么,但你可能也会发现这个链接有用:https://dev59.com/fGAf5IYBdhLWcg3wukpk - pyInTheSky
5个回答

2
您可以像这样阅读整个文件:
content = []
with open('/path/to/file.txt', 'r') as file
    content = file.readlines()
    #Maybe you want to strip the lines
    #content = [line.strip() for line in file.readlines()]

这里有一个包含文件所有行的列表。
def count_consecutive_lines(lines):
    counter = 1
    output = ''
    for index in range(1, len(lines)):
        if lines[index] != lines[index-1]:
            output += '{} repeats {} times.\n'.format(lines[index], counter)
            counter = 1
        counter += 1
   return output

并将其调用如下

print(count_consecutive_lines(content))

谢谢,我会尝试一下。我能否使用file.write('\n'.join)将计数写入另一个.txt文件中(\n表示每行换行)? - slynes
@slynes 是的,你可以。 - Mr. E

1

一种不需要将整个文件加载到内存中的答案:

last = None
count = 0
result = []

with open('sample.txt', 'rb') as f:
    for line in f:
        line = line.strip()
        if line == last:
            count = count + 1
        else:
            if count > 0:
                result.append(count)
            count = 1
            last = line

    result.append(count)
    print result

结果:

[3, 4, 5]

更新

该列表包含整数,您只能join字符串,因此您需要进行转换。

outFile.write('\n'.join(str(n) for n in result))

谢谢,这个方法很好用。我想把结果写入一个 .txt 文件而不是在结尾处打印出来,所以我使用了 outFile.write('\n'.join(result))(outFile 已经定义),但出现了问题,无法正常工作。 - slynes
@slynes 已更新答案。 - totoro

0
您可以尝试将文件数据转换为列表,并按照以下方法处理:
with open("./sample.txt", 'r') as fl:
    fl_list = list(fl)
    unique_data = set(fl_list)
    for unique in unique_data:
        print "%s - count: %s" %(unique, fl_list.count(unique))

#output:
ANS - count: 8
AUT - count: 4

1
他不想要一个单词的总数,而是想要一个单词的连续计数。请看他的例子,其中“ans”在期望的最终结果中出现了两次。 - pyInTheSky
1
不是 OP 想要的...计算连续相似项...而不是计算所有相似项。 - Iron Fist
但是我能单独获取计数吗?例如:ANS-计数:3,AUT-计数:4,ANS-计数:5。我需要记录AUT出现的次数。 - slynes

0

打开你的文件并读取它以进行计数:

l=[]
last=''
with open('data.txt', 'r') as f:
    data = f.readlines()

    for line in data:
        words = line.split()
        if words[0]==last:
            l[-1]=l[-1]+1
            last=words[0]
        else:
            l.append(1)
        if last=='':
            last=words[0]

如果条件语句不符合语法规则,就会出现赋值与比较的混淆。 - pyInTheSky

0

这是您期望的输出结果 :)

with open("./sample.txt", 'r') as fl:
    word = list(fl)
    count=1
    length=[]
    for i in range(1, len(word)):
        if word[i-1] == word[i]:
           count += 1
        else:
            length.append(count)
            count=1
    length.append(count)
    print (length)

#output as you excpect:
[3, 4, 5]

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