如何在文本文件中重复的值之间计算文件中的行数

时间:2018-11-30 02:13:45

标签: python

在以下示例中,我想计算'A'之后和'A'重复之前的文本文件中的行数:

A1
   Apple
   Mangoes
   Oranges
A2
   Strawberries
   Grapefruit
A3
   Papaya 
   Sweet_lime

我希望结果为

A1: 3, A2: 2, A3: 2

到目前为止,我已经尝试过:

f = open("temp.txt","r")
count = 0
A_vals = []
for lines in f:
    value = re.search("(A\d)",lines)
    header = value.group(1)
    if header in lines:
        count += 1
    A_vals.append(count)

我没有得到预期的结果。任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:0)

如果以可靠的方式格式化temp,则可以使用。 将Temp.txt设置为:

A1
        Apples
        Mangoes
        Oranges
A2
        Strawberries
        Grapefruit
A3
        Papaya
        Sweet_Lime
END

然后...

counter=0
returnString = ""
with open("temp.txt", "r") as file:
    currHeader=file.readline()[:-1]
    for i in file.readlines():
        if "\t" not in i:
            returnString+="{}: {}, ".format(currHeader, counter)
            counter=0
            currHeader = i[:-1]         
        else:
            counter+=1
print(returnString.rstrip(" ,"))

返回:

A1: 3, A2: 2, A3: 2

因此,当我们逐行检查行时,如果没有制表符(由于缩进),则应将该行视为本节的“标题”。我们使用[:-1]从行尾去除换行符。然后我们对行进行计数,直到下一个标题为止。看到新的标题部分后,计数器将重置。我们使用END作为最后一个标头,因为它后面没有任何值,所以不会打印出来。

答案 1 :(得分:0)

由于先输入A,然后再输入数字,请使用正则表达式来匹配模式。您可以使用默认字典作为计数器。

import re
from collections import defaultdict

A_vals = defaultdict(int)
current_A = None

with open('temp.txt') as fp:
    for line in fp:
        m = re.match(r'A\d+', line)
        if m:
            current_A = m.group()
            continue
        if current_A:
            A_vals[current_A] += 1

print(dict(A_vals))
# prints:
{'A1': 3, 'A2': 2, 'A3': 2}

答案 2 :(得分:0)

假设您可以访问文件的全部内容,则可以按标题拆分内容(保留它们),然后压缩结果:

import re

pattern = re.compile('A\d+')

content = """A1
   Apple
   Mangoes
   Oranges
A2
   Strawberries
   Grapefruit
A3
   Papaya
   Sweet lime"""

chunks = re.split('(A\d+)', content)
non_empty_chunks = [chunk for chunk in chunks if chunk]

result = {key: len(text.splitlines()) - 1 for key, text in zip(non_empty_chunks[0::2], non_empty_chunks[1::2])}
print(result)

输出

{'A2': 2, 'A1': 3, 'A3': 2}

请注意,如果没有要计数的元素,它将返回0,例如:

content = """A1
   Apple
   Mangoes
   Oranges
A2
A3
   Papaya
   Sweet lime"""

输出

{'A1': 3, 'A3': 2, 'A2': 0}

答案 3 :(得分:0)

这是我尝试过的。

代码:

f = open("temp.txt","r")
Result=[]
S=0 # State 0.
Lines=0
for i in f.read():
    if S==0:
        if i=="\n":
            S=1
            Lines+=1
    elif S==1:
        if i=="A":
            Result.append(Lines-1)
            Lines=0
        S=0
Result.append(Lines)
f.close()
print(*("A"+str(i+1)+": "+str(Result[i])for i in range(len(Result))),sep=", ")

文字:

A1
   Apple
   Mangoes
   Oranges
A2
   Strawberries
   Grapefruit
A3
   Papaya 
   Sweet_lime

结果:

A1: 3, A2: 2, A3: 2