Python: как прочитать файл данных с разным количеством столбцов - PullRequest
9 голосов
/ 22 марта 2012

Мой друг должен прочитать много данных (около 18000 наборов данных), которые все отформатированы досадно.В частности, предполагается, что данные состоят из 8 столбцов и ~ 8000 строк данных, но вместо этого данные доставляются в виде столбцов из 7, при этом последняя запись выливается в первый столбец следующей строки.

Кроме того, каждый ~30 строк есть только 4 столбца.Это связано с тем, что какая-то восходящая программа преобразует массив 200 x 280 в массив 7x8120.

У меня такой вопрос: как мы можем прочитать данные в массив 8x7000.Мой обычный арсенал np.loadtxt и np.genfromtxt терпит неудачу, когда количество столбцов неравномерно.

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

Вот ссылка на типичный файл данных: http://users -phys.au.dk / hha07 / hk_L1.ref

Ответы [ 3 ]

11 голосов
/ 22 марта 2012

Еще более простой подход, о котором я только что подумал:

with open("hk_L1.ref") as f:
    data = numpy.array(f.read().split(), dtype=float).reshape(7000, 8)

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

Хотя я думаю, что задача все равно будет связана с вводом / выводом, этот подход должен использовать небольшое время процессора, если это имеет значение.

1 голос
/ 22 марта 2012

При условии, что я правильно вас понял (см. Мой комментарий), вы можете разделить свой ввод в токены, а затем обработать его в блоках по восемь нечетко:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

f = open('filename.ref')
tokens = f.read().split()

rows = []
for idx, token in enumerate(tokens):
    if idx % 8 == 0:
        # this is a new row, use a new list.
        row = []
        rows.append(row)
    row.append(token)

# rows is now a list of lists with the desired data.

Это выполняется менее чем за 0,2 секунды на моем компьютере, как есть.

Редактировать: использовал @ предложение СвенМарнах.

0 голосов
/ 22 марта 2012

Как насчет этого?

data = []
curRow = []
dataPerRow = 8
for row in FILE.readlines():
    for item in row.split():
         if len(curRow) == dataPerRow:
             data.append(curRow)
             curRow = []
         curRow.Append(item)

data.append(curRow)

(при условии, что FILE - это файл, который читается) Затем у вас есть список списков, который можно использовать для чего угодно.

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