Извлечение данных из текстового файла в виде массива - PullRequest
0 голосов
/ 09 апреля 2020

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

import string 

solution_path = "/homer/my_dir/solution_detail.txt"
solution = open(solution_path).read()

all_actions = ['company_name','email_address','full_name']
n = 0
sequence_array = []
for line in solution:
            for action in all_actions:
                    if action in line:
                        sequence_array[n] = action
                        n = n+1
for x in range(len(sequence_array)):
            print (sequence_array[x])

Но этот код ничего не делает, но работает без ошибок.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Существует несколько проблем с кодом.

  1. .read() в файле создает строку single . В результате for line in solution: выполняет итерацию для каждого символа текста файла, а не для каждой строки. (Имя line является , а не особенным, если вы думали, что это так. Итерация зависит только от того, что повторяется.) Естественный способ получить строки из файла - это l oop более сам файл , пока он открыт. Чтобы сохранить файл открытым и убедиться, что он закрывается должным образом, мы используем блок with.

  2. Вы не можете просто назначить sequence_array[n], если список уже не меньше n+1 элементы длинные. (Причина, по которой вы не получаете сообщение об ошибке, заключается в том, что if action in line: никогда не соответствует действительности из-за первого пункта.) К счастью, мы можем просто .append до конца списка.

  3. Если строка содержит кратное all_actions, оно будет сохранено несколько раз. Это, вероятно, не то, что вы хотите, чтобы это произошло. Встроенная функция any облегчает решение этой проблемы; мы можем предоставить ему выражение генератора для элегантного решения. Но если ваши точные потребности отличаются, то, конечно, есть разные подходы.

  4. Хотя последний l oop в теории в порядке, он лучше для l oop напрямую, так же, как вы пытаетесь l oop сверх solution. Но вместо того, чтобы составить список, мы могли бы просто напечатать результаты, как они были найдены.

Так, например:

with open(solution_path) as solution:
    for line in solution:
        if any(action in line for action in all_actions):
            print(line)
0 голосов
/ 09 апреля 2020

Происходит следующее: solution содержит весь текст внутри файла. Поэтому, когда вы выполняете итерацию for line in solution, вы фактически выполняете итерацию по каждому символу в отдельности, поэтому вы никогда не получаете попаданий.

попробуйте следующий код (я не могу проверить его, так как не могу если у вас есть файл)

solution_path = "/homer/my_dir/solution_detail.txt"
all_actions = ['company_name','email_address','full_name']


sequence_array = []
with open(solution_path, 'r') as f:
    for line in f.readlines():
        for action in all_actions:
            if action in line:
                sequence_array.append(action)

Это соберет все действия в документах. если вы хотите распечатать их все

for action in sequence_array:
    print(action)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...