从文件中选择特定行

时间:2019-02-25 22:42:22

标签: python split

我有一个带有条目的文本文件

***********************
*    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

我将不胜感激任何建议/解决方案。谢谢。

6 个答案:

答案 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()))