Как читать числа из смешанного текстового файла в python

У меня есть текстовый файл, состоящий из текста и чисел. Это выглядит примерно так:

> this is a paragraph which is introductory which lasts
  some more lines 

text text text

567 45 32 468
974 35 3578 4467
325 765 355 5466

text text text
1 3 6
text text>

Мне нужно хранить строки, содержащие 4 числовых элемента.

Когда я использую команду чтения, все элементы считываются и сохраняются в виде строк. Я не уверен, смогу ли я преобразовать числа в цифры, не фильтруя их сначала.

Буду признателен за любую помощь. Спасибо.


person yagmursu    schedule 27.03.2020    source источник
comment
Поможет ли вам мой ответ?   -  person Joshua    schedule 15.04.2020
comment
если да, то не забудьте отметить ответ, который помог   -  person Joshua    schedule 15.04.2020


Ответы (8)


Используйте функцию splitlines().

A=open(your file here,'r').read().splitlines()

Это будет список, и теперь вы можете извлечь все, что вам нужно. Нравиться:

Req=[]
for i in A:
    elem = [s.isnumeric() for s in i.split(' ')]
    if len(elem) == 4 and all(elem):
        Req.append(i)
person Joshua    schedule 27.03.2020
comment
"123 321".isnumeric() не равно true, поэтому это недопустимый способ поиска строк с номерами. Вам придется разделить каждую строку и проверить каждый элемент на числовые значения. - person Sebastian Baltser; 27.03.2020

Прочитайте файл по строкам и проанализируйте их. Пропустить строки с неравными 4 элементами и строки, которые не состоят из 4 целых чисел, разделенных пробелом:

results = []
with open (filename) as f:
    for line in f:
        line = line.strip().split()
        if len(line) != 4:
            continue  # line has != 4 elements

        try: 
            numbers = map(int,line)
        except ValueError:
            continue # line is not all numbers

        # do something with line
        results.append(line)  # or append(list(numbers)) to add the integers

print(*results, sep="\n")

печатает:

['567', '45', '32', '468']
['974', '35', '3578', '4467']
['325', '765', '355', '5466']
person Patrick Artner    schedule 27.03.2020

Если вы можете предположить, что в нужных вам строках будет только 4 числа, то это решение должно работать:


nums = []
with open('filename.txt') as f:
    for line in f:
        line = line.split()
        if len(line) == 4 and all([c.isdigit() for c in line]):
            # use [float(c) for c in line] if needed
            nums.append([int(c) for c in line])

print(nums)
person Phillyclause89    schedule 27.03.2020

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

import re
matches = [m[0] for m in re.findall(r"((\d+\s){4})", s)]

Теперь переменная matches содержит строки, содержащие ровно четыре целых числа. После этого вы можете разделить каждую строку и преобразовать в целые числа, если хотите:

matches = [[int(i) for i in s.split(' ')] for s in matches]

Результат:

[[567, 45, 32, 468], [974, 35, 3578, 4467], [325, 765, 355, 5466]]
person Sebastian Baltser    schedule 27.03.2020

Если вы знаете, как использовать модуль регулярного выражения Python, вы можете сделать это:

import re

if __name__ == '__main__':

    with open(TEST_FILE, 'r') as file_1:
        for line in file_1.readlines():

            if re.match(r'(\d+\s){4}', line): 
                line = line.strip() # remove \n character
                print(line) # just lines with four numbers are printed

Результат для вашего примера файла:

567 45 32 468
974 35 3578 4467
325 765 355 5466
person Felipe Borges    schedule 27.03.2020

Для меня это звучит как задача для re модуля. Я бы сделал:

import re
with open('yourfile.txt', 'r') as f:
    txt = f.read()
lines_wre.Mnumbers = re.findall(r'^\d+\s\d+\s\d+\s\d+$', txt, re.M)
print(lines_wre.Mnumbers)

Выход:

['567 45 32 468', '974 35 3578 4467', '325 765 355 5466']

Объяснение: флаг re.M означает, что ^ и $ будут соответствовать началу/концу строки, \s обозначает пробел, \d+ обозначает 1 или более цифр.

person Daweo    schedule 27.03.2020

Использование регулярных выражений здесь будет наиболее эффективным. Мы создаем шаблон с помощью re.compile, а затем используем метод поиска или сопоставления, чтобы найти шаблон в строке.

import re

p = re.compile(r'[\d]{4}') # \d matches for single digit and {4} will look for 4 continuous occurrences.
file = open('data.txt', 'r') # Opening the file
line_with_digits = [] 
for line in file:  # reading file line by line
    if p.search(line): # searching for pattern in line
        line_with_digits.append(line.strip())  # if pattern matches adding to list

print(line_with_digits) 

Входной файл для вышеуказанной программы:

text text text

567 45 32 468
974 35 3578 4467
325 765 355 5466

text text text
1 3 6
text text

text  5566 text 45 text
text text 564 text 458 25 text

Результат:

['974 35 3578 4467', '325 765 355 5466', 'text  5566 text 45 text']

Надеюсь это поможет.

person Anidhya Bhatnagar    schedule 27.03.2020

вы можете использовать регулярное выражение:

import re

result = []
with open('file_name.txt') as fp:
    for line in fp.readlines():
        if re.search(r'\d{4}', line):
            result.append(line.strip())

print(result)

выход:

['974 35 3578 4467', '325 765 355 5466']
person kederrac    schedule 27.03.2020