Выбор конкретных строк из файла - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть текстовый файл с записями

***********************
*    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 строк.Мне нужно получить числа из 2-го столбца и суммировать их.Чтобы выбрать такую ​​строку, я сказал

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 голосов
/ 26 февраля 2019

Вы можете построить свое регулярное выражение таким образом, чтобы оно возвращало числа, которые вы хотите добавить, непосредственно с учетом шаблона в каждой строке:

import re
with open(afile) as f:
    total = sum(int(number) for number in re.findall("\d *\* *(\d+)",f.read()))
0 голосов
/ 26 февраля 2019

попробуйте это тоже.

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)
0 голосов
/ 26 февраля 2019

Попробуйте это:

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
0 голосов
/ 26 февраля 2019

Недостаток, который Чернослив обнаружен в логике, абсолютно верен.

Однако, если вам нужно решение на основе регулярных выражений, вы идете ..

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)
0 голосов
/ 26 февраля 2019

Измените свой eval как:

 If not 'totalEven' in l and not '*****' in l:
    Dothe job
0 голосов
/ 26 февраля 2019

Ваша логическая логика неверна:

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] выбирает третий столбец, а не 2-й: Python имеет индексирование с нуля.Вы можете упростить это, взяв последний столбец последний :

    nEv = l.split('*')[-1] # Chooses the right-most column of the line

Исправление

Поскольку у вас также есть разделители столбцов на полях,будет пустой строкой в ​​каждом конце списка, например

 ['', '   1   ', '  1440000 ', '']

Нужный столбец: [2] или [-2].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...