我有一个带有条目的文本文件
***********************
* Row * totalEven *
************************
* 0 * 125000 *
************************
************************
* Row * totalEven *
************************
* 0 * 340000 *
* 1 * 159000 *
************************
************************
* Row * totalEven *
************************
* 0 * 1360000 *
* 1 * 1440000 *
* 2 * 1440000 *
* 3 * 1380000 *
* 4 * 1350000 *
* 5 * 1440000 *
* 6 * 1440000 *
* 7 * 1440000 *
* 8 * 1440000 *
* 9 * 1422000 *
* 10 * 180000 *
,这样就增加了6000行。我需要从第二列中获取数字并将其汇总。我选择
f = open(afile,'r')
for i, l in enumerate(f):
if l=="* Row * totalEven *" and (l=='************************'):
continue
else:
nEv = l.split('*')[2] #here it chooses the 2nd column of the line
但是它给我输出的是第三列的数字,空行和带有“ totalEven”的行。然后我也尝试使用if re.search('* Row * totalEven *', l):
,但它给出了此错误
Traceback (most recent call last):
File "thecode.py", line 77, in <module>
main()
File "thecode.py", line 45, in main
iArr = getFileValue('rootOut',iArr)
File "thecode.py", line 62, in getFileValue
if re.search('* Row * totalEven *', l):
File "/usr/lib64/python2.6/re.py", line 142, in search
return _compile(pattern, flags).search(string)
File "/usr/lib64/python2.6/re.py", line 245, in _compile
raise error, v # invalid expression
sre_constants.error: nothing to repeat
我将不胜感激任何建议/解决方案。谢谢。
答案 0 :(得分:4)
您的布尔逻辑不正确:
if l=="* Row * totalEven *" and (l=='************************'):
该如何评估为True
?输入行永远不能同时等于这两个字符串。我认为您需要一个or
,而不是and
。也许更好:
if l != "* Row * totalEven *" and \
l != '************************':
nEv = l.split('*')[2] # Choose the 2nd column of the line
现在,请注意[2]
选择第三列,而不是第二列:Python具有从零开始的索引。您可以使用 last 列来简化此操作:
nEv = l.split('*')[-1] # Chooses the right-most column of the line
更正
由于在页边距上也有列定界符,所以列表的每一端都会有一个空字符串,例如
['', ' 1 ', ' 1440000 ', '']
您想要的列是[2]
或[-2]
。
答案 1 :(得分:2)
Prune在逻辑中发现的缺陷是绝对正确的。
但是,如果您想要基于正则表达式的解决方案,那么就可以了。
import re
with open(afile,'r') as infile:
input_list = infile.readlines()
final_summation = 0
for input_string in input_list:
temp_list = map(int, re.findall(r'\d+', input_string))
if len(temp_list) > 0:
final_summation += int(temp_list[-1])
print(final_summation)
答案 2 :(得分:1)
也尝试这个。
f = open('./samplestring.txt','r')
nums = []
for l in f.readlines():
finds = re.findall('\d+',l.strip())
if(len(finds) == 2):
nums.append(int(finds[1]))
sum(nums)
答案 3 :(得分:0)
将您的评估更改为:
If not 'totalEven' in l and not '*****' in l:
Dothe job
答案 4 :(得分:0)
尝试一下:
with open('file.txt') as f:
sum = 0
for i, line in enumerate(f):
try:
sum = (int(line[15:len(line)-3]))+ sum
except:
pass
print("The sum is {} ".format(sum))
结果:
The sum is 14956000
答案 5 :(得分:0)
您可以以这样的方式构建正则表达式,使其返回要直接添加的数字,并考虑到每一行的模式:
import re
with open(afile) as f:
total = sum(int(number) for number in re.findall("\d *\* *(\d+)",f.read()))