coldata - класс для работы данными из текстовых файлов в виде таблицы | jenyay.net

coldata - класс для работы данными из текстовых файлов в виде таблицы

Оглавление

Введение

Довольно часто приходится читать различные массивы данных (числа), которые хранятся в текстовом файле в виде столбцов. Такие файлы еще иногда называют ASCII-data, и многие программы на выходе создают такие файлы, причем у файлов иногда может быть заголовок, а может его и не быть. Для удобного чтения и записи таких файлов я и написал небольшой класс на языке Python.

Какие файлы можно читать с помощью coldata

  • Файлы должны представлять собой столбцы чисел (целых или с плавающей точкой).
  • Столбцов может быть несколько.
  • Столбцы разделяются пробелами или табуляциями. Количество символов-разделителей не важно.
  • В начале файла может быть шапка, которую класс coldata игнорирует, если не может преобразовать ее в массив чисел с плавающей точкой.
  • При чтении можно пропускать некоторое количество строк в начале файла.
  • Разделителем дробной части в числах может быть как точка, так и запятая.

Приведу несколько примеров файлов, которые можно читать с помощью этого класса:

0.0
1.128
2.35
-1.258
-3.33e-1

0.0000      1.2512
-1.1280      5.2687
2.3500      9.1576
-1.2580      -1.2457
-0.3300      95.3654

Sample ASCII data
AValue BValue
-------------------
0.0000      1.2512
-1.1280      5.2687
2.3500      9.1576
-1.2580      -1.3457
-0.3300      95.3654

Sample ASCII data
AValue BValue
-------------------
0,0000      1,2512
-1,1280      5,2687
2,3500      9,1576
-1,2580      -1,3457
-0,3300      95,3654

Файлы

Архив с исходниками и примерами файлов лежит здесь.

Описание класса coldata

Для использования класса coldata его в первую очередь надо импортировать из модуля coldata.py

from coldata import coldata

После этого класс coldata можно использовать в двух режимах:

  • Чтение текстовых файлов.
  • Запись текстовых файлов

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

Примеры чтения текстовых файлов

#-*- coding: utf-8 -*-

from coldata import coldata

columns = coldata ("sample1.txt")

# Для доступа к столбцам используем их индексы
print columns[0]
print columns[1]

В результате чтения файла с содержимым (sample1.txt)

Sample ASCII data
AValue BValue
-------------------
0.0000      1.2512
-1.1280      5.2687
2.3500      9.1576
-1.2580      -1.3457
-0.3300      95.3654

мы получим результат

[0.0, -1.1279999999999999, 2.3500000000000001, -1.258, -0.33000000000000002]
[1.2512000000000001, 5.2686999999999999, 9.1576000000000004, -1.2457, 95.365399999999994]

Второй пример использует for для перебора столбцов. Файл sample2.txt отличается от предыдущего файла только тем, что в качестве разделителя дробной части используется запятая вместо точки.

from coldata import coldata

columns = coldata ("sample2.txt", skiprows=4)

for col in columns:
        print col

Обратите внимание, что в этом примере мы использовали еще один необязательный параметр конструктора - skiprows, значение которого обозначает сколько строк надо пропустить при чтении файла. В это количество строк входит и строки, образующие заголовок файла. В этом примере мы пропускаем 4 строки, 3 из которых образуют заголовок:

Sample ASCII data
AValue BValue
-------------------

Четвертая пропущенная строка уже является данными. Поэтому в качестве результата у нас будут столбцы на один элемент короче, чем в предыдущем примере, и в консоли мы увидим следующих результат работы:

[-1.1279999999999999, 2.3500000000000001, -1.258, -0.33000000000000002]
[5.2686999999999999, 9.1576000000000004, -1.3456999999999999, 95.365399999999994]

Пример записи текстовых файлов

#-*- coding: utf-8 -*-

from coldata import coldata

columns = coldata ()

columns.addcolumn ([1.123, 5.358, -8.369, 2.0e-1, 15.6987])
columns.addcolumn ([6.3687, -9.3154, -7.1795, 8.2547, 0.2147])

print columns.tostr(format="%.5f", deliver="    ")

columns.save ("out.txt", format="%.5f", deliver="    ")

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

С помощью функции tostr() формируем строку, содержащую данные, оформленные в виде столбцов. Функция save() сохраняет ту же самую строку в файл. Обе функции имеют два необязательных параметра:

  • format - описывает формат представления каждого числа. По умолчанию используется "%f".
  • deliver - разделитель между столбцами в строке. По умолчанию используется символ табуляции "\t".

В результате выполнения этого примера в консоли будет выведено:

1.12300      6.36870
5.35800      -9.31540
-8.36900      -7.17950
0.20000      8.25470
15.69870      0.21470

То же самое будет сохранено в файл out.txt.

В версии 1.6 модуля coldata добавилась функция save(), которая может сохранять массив столбцов в файл, не создавая экземпляр класса coldata в явном виде (внутри функция по-прежнему использует метод save() из coldata).

Определение функции save():

save (columns, fname, format = "%f", deliver = "\t")

Пример использования:

#-*- coding: utf-8 -*-

import coldata

columns = [ [1.123, 5.358, -8.369, 2.0e-1, 15.6987], [6.3687, -9.3154, -7.1795, 8.2547, 0.2147] ]

coldata.save (columns, "out_static.txt", format="%.5f", deliver="    ")

Вот и все, как видите, пользоваться классом coldata очень просто.

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

История версий

1.7 (30.06.2009)

  • Добавил метод __len__(), чтобы можно было определять количество столбцов с помощью функции len().
  • Добавил файл лицензии (основанную на BSD).

1.6

  • Появилась функция save() для сохранения массива столбцов в файл, не создавая экземпляр класса coldata в явном виде.
  • Рефакторинг и переименование примеров.

1.5

  • Первая публичная версия.

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 5.0/5. Всего 4 голос(а, ов)



Rodegast 27.06.2009 - 11:53

Лицензия

Какая у него лицензия? Это я про возможность использования класса в других проектах.

Jenyay 28.06.2009 - 09:31

Да, про лицензию забыл. Считайте пока, что можете использовать где угодно. Потом ее приложу.

Andrey 20.09.2011 - 14:29

Благодарность

Спасибо большое!
Мне, как начинающему "питонисту", очень полюбилась ваша библиотека. happy smiley

Jenyay 20.09.2011 - 17:54

И Вам спасибо, очень приятно. :)


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 147