在以下示例中,我想计算'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)
我没有得到预期的结果。任何帮助表示赞赏!
答案 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