Чтение данных из текстового файла и сохранение их в массиве в python - PullRequest
1 голос
/ 17 января 2020

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

Каждый раз, когда строка 'EOE' нашел, я хотел бы перейти к новой строке и продолжить чтение в записи построчно из текстового файла.

Кажется, я не могу объявить двумерный массив строк или прочитать значения успешно. Я новичок в python из C, поэтому мой синтаксис и общее понимание python невелики.

rf = open('data_small.txt', 'r')
lines = rf.readlines()
rf.close()
i = 0
j = 0

line_array = np.array((200, 200))

for line in lines:
    line=line.strip()
    print(line)
    line_array[i][j] = line
    if line == 'EOE':
        i+=1
    j+=1

rf.close()

line_array

Текстовый файл выглядит примерно так:

-----
Entry1=50
Entry2=SomeText
Entry3=Instance.Test.ID=67
EOE
-----
Entry1=Processing
Entry2=50.87.78
Entry3=Instance.Test.ID=91
EOE
-----
Entry1=50
Entry2=SomeText
Entry3=Instance.Test.ID=67
EOE
-----

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

array = [
['-----', 'Entry1=50', 'Entry2=SomeText', 'Entry3=Instance.Test.ID=67', 'EOE'],
['-----', 'Entry1=Processing', 'Entry2=50.87.78', 'Entry3=Instance.Test.ID=91', 'EOE'],
['-----', 'Entry1=50', 'Entry2=SomeText', 'Entry3=Instance.Test.ID=67', 'EOE']
]

Ответы [ 2 ]

1 голос
/ 17 января 2020

Это один из подходов.

Пример:

res = [[]]
with open(filename) as infile:
    for line in infile:            #Iterate each line
        line = line.strip()        #strip new line
        if line == 'EOE':          #check for `EOE`
            res.append([])         #Add new sub-list
        else:
            res[-1].append(line)   #Append content to previous sub-list

print(res)

Выход:

[['-----', 'Entry1=50', 'Entry2=SomeText', 'Entry3=Instance.Test.ID=67'],
 ['-----',
  'Entry1=Processing',
  'Entry2=50.87.78',
  'Entry3=Instance.Test.ID=91'],
 ['-----', 'Entry1=50', 'Entry2=SomeText', 'Entry3=Instance.Test.ID=67'],
 ['-----']]
0 голосов
/ 17 января 2020

Вот подход "pythoni c":

>>> with open('data_small.txt') as input_file:
>>>    contents = input_file.read()

>>> contents

'-----\nEntry1=50\nEntry2=SomeText\nEntry3=Instance.Test.ID=67\nEOE\n-----\nEntry1=Processing\nEntry2=50.87.78\nEntry3=Instance.Test.ID=91\nEOE\n-----\nEntry1=50\nEntry2=SomeText\nEntry3=Instance.Test.ID=67\nEOE\n-----'

Первый шаг - разделить на \nEOE\n:

>>> contents = contents.split('\nEOE\n')
>>> contents

['-----\nEntry1=50\nEntry2=SomeText\nEntry3=Instance.Test.ID=67',
 '-----\nEntry1=Processing\nEntry2=50.87.78\nEntry3=Instance.Test.ID=91',
 '-----\nEntry1=50\nEntry2=SomeText\nEntry3=Instance.Test.ID=67',
 '-----']

Далее следует разделить каждый элемент в списке на \n:

>>> contents = [content.split('\n') for content in contents]
>>> contents

[['-----', 'Entry1=50', 'Entry2=SomeText', 'Entry3=Instance.Test.ID=67'],
 ['-----',
  'Entry1=Processing',
  'Entry2=50.87.78',
  'Entry3=Instance.Test.ID=91'],
 ['-----', 'Entry1=50', 'Entry2=SomeText', 'Entry3=Instance.Test.ID=67'],
 ['-----']]

Это даст вам желаемый результат. Если вам не нужен последний элемент, просто выполните:

>>> contents = contents[:-1]
>>> contents

[['-----', 'Entry1=50', 'Entry2=SomeText', 'Entry3=Instance.Test.ID=67'],
 ['-----',
  'Entry1=Processing',
  'Entry2=50.87.78',
  'Entry3=Instance.Test.ID=91'],
 ['-----', 'Entry1=50', 'Entry2=SomeText', 'Entry3=Instance.Test.ID=67']]

PS: убедитесь, что вы используете оператор with только для открытия и чтения файла, а затем выполните вычисления вне with заявление.

...