Элегантный способ обработки и пропуска первой строки (строк) (содержащих метаданные) при чтении массива из файла в Python (возможно, панды)? - PullRequest
0 голосов
/ 04 сентября 2018

Предположим, у меня есть файл, подобный этому bla.txt:

    21        27       268       288       
55.1   21.2   25.5   23.5   22.3   20.8
28.3   27.1   27.2   26.   25.   23.1 
29.8   28.3   29.0   28.6   27.2   24.4 

Первая строка содержит метаданные, которые я хотел бы использовать позже в моем скрипте (a, b, c, d в моем скрипте ниже), затем остальная часть представляет собой простой массив, который легко читается. Есть ли способ обработать эту первую строку, пропуская ее во время чтения массива?

Другими словами, как сделать следующее более элегантно / питонически?

import numpy as np

fname = 'bla.txt'

with open(fname) as f:
    lines = f.readlines()
    a, b, c, d = [float(x) for x in lines[0].split()]

myarray = np.loadtxt(fname, skiprows=1)

EDIT : Решение с pandas приветствуется. [Обратите внимание, что в идеале решение, способное обрабатывать и пропускать более одной строки метаданных, было бы идеальным]

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Вы можете указать numpy.loadtxt пропускать строки.

>>> import numpy as np
>>> np.loadtxt('bla.txt', skiprows=1)
array([[55.1, 21.2, 25.5, 23.5, 22.3, 20.8],
       [28.3, 27.1, 27.2, 26. , 25. , 23.1],
       [29.8, 28.3, 29. , 28.6, 27.2, 24.4]])

Вы можете получить первую строку любого файла без numpy с помощью

>>> with open('bla.txt') as f:
...     line1 = next(f)
... 
>>> line1
'    21        27       268       288       \n'

Если в строке заголовка не пропущены значения, вы также можете просто прочитать весь файл с помощью loadtxt, а затем нарезать массив на данные и часть заголовка.

Вы не отметили его, но я рекомендую использовать pandas для удобства в вашем конкретном случае.

>>> import pandas as pd
>>> df = pd.read_csv('bla.txt', delim_whitespace=True)
>>> line1 = list(df.columns)
>>> data = df.reset_index().values
>>> 
>>> line1
['21', '27', '268', '288']
>>> data
array([[55.1, 21.2, 25.5, 23.5, 22.3, 20.8],
       [28.3, 27.1, 27.2, 26. , 25. , 23.1],
       [29.8, 28.3, 29. , 28.6, 27.2, 24.4]])
0 голосов
/ 04 сентября 2018

Файлы являются итераторами над своими строками, поэтому вы можете просто использовать next(f), чтобы получить первую строку И переместить указатель итератора на вторую. Затем (в блоке with) вы можете передать открытый файл f в numpy.loadtxt(), чтобы он начал читать только со второй строки:

import numpy as np

fname = 'bla.txt'

with open(fname) as f:
    first = next(f)
    a, b, c, d = [float(x) for x in first.split()]
    myarray = np.loadtxt(f) # no skiprows here
0 голосов
/ 04 сентября 2018

Просто сделайте lines = f.readlines()[1:] вместо lines = f.readlines().

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