Python: как разобрать следующую строку? - PullRequest
0 голосов
/ 01 февраля 2019

Я не настолько опытен с Python, поэтому моя просьба помочь мне улучшить мой код.

Я пытаюсь проанализировать "Стив", который будет находиться под полем "Имя":

xxxx xxxx xxxx Name
zzzz zzzz zzzz Steve

мой код выглядит так:

for line in myfile.readlines():
    [..]
    if re.search(r'Name =', line):
        print("Destination = ")
        samples+=line[15:19]
        nextline = "y"
    if nextline == 'y':
        samples+=line[15:19]

В конце концов я напечатаю все:

[..]    
for s in samples:
   myfile2.write(s)

Это работает, но я не могу поверить, что нет более разумного способасделать это (например, получить доступ к следующей строке после выполнения условий ..).

Это пример файла, который мне нужно проанализировать.Но структура может варьироваться, например,

#This is another example
Name =
Steve

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Не изобретай велосипед.Используйте модуль csv, например, с DictReader:

import csv
with open("input") as f:
    reader = csv.DictReader(f, delimiter=" ")
    for line in reader:
        print(line["Name"])

. Предполагается, что «Стив» не всегда будет буквально ниже «Имени», поскольку позиция может отличаться, если элементы вдругие столбцы длиннее или короче, а скорее элемент в том же столбце.Кроме того, это предполагает, что строка с "Name" будет первой строкой в ​​файле.

Если это не так, и если Name может появиться в любой строке, и вам нужно только имяв строке ниже вы можете просто вызвать next на том же итераторе, который используется в цикле for:

import re
with open("input") as f:
    for line in f:  # note: no readlines!
        if re.search(r'\bName\b', line):  # \b == word boundary
            pos = line.split().index("Name")
            name = next(f).split()[pos]
            print(name)
0 голосов
/ 01 февраля 2019

list.txt:

zzzz zzzz zzzz Abcde
xxxx xxxx xxxx Name
zzzz zzzz zzzz Steve
zzzz zzzz zzzz Efghs

Вы можете разбить каждую строку на пробел и затем прочитать интересующий индекс массива.

Как показано ниже:

logFile = "list.txt"

with open(logFile) as f:
    lines = f.readlines()

    for line in lines:
        # split using space
        result = line.split(" ")
        # you can access the name directly:
        #    name = line.split(" ")[3]
        # python array starts at 0
        # so by using [3], you access the 4th column.
        print result[3] 

В качестве альтернативы вы можете использовать numpy для печати только столбца 4 из словаря данных:

import numpy
logFile = "list.txt"

data = []
with open(logFile) as f:
    lines = f.readlines()

    for line in lines:
        result = line.split(" ")
        data.append(result)

matrix = numpy.matrix(data)
print matrix[:,[3]]

Подробнее об этом можно прочитать здесь: StackOverflow Question Некоторая матричная информация

0 голосов
/ 01 февраля 2019

list.txt:

zzzz zzzz zzzz Abcde
xxxx xxxx xxxx Name
zzzz zzzz zzzz Steve
zzzz zzzz zzzz Efghs

, а затем:

logFile = "list.txt"

with open(logFile) as f:
    content = f.readlines()    
# you may also want to remove empty lines
content = [l.strip() for l in content if l.strip()]

# flag for next line
nextLine = False

for line in content:
    find_Name = line.find('Name')       # check if Name exists in the line

    if find_Name > 0                    # If Name exists, set the next_line flag
        nextLine = not nextLine
    else:
        if nextLine:                    # If the flag is set, grab the Name
            print(line.split(" ")[-1])  # Grabbing the last word of the line
            nextLine = not nextLine

ВЫХОД:

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