Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 23, 2013 08:48:58

r1pley
Зарегистрирован: 2013-11-23
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразование в бинарный вид файла с данными

Добрый день уважаемое сообщество программеров на python. Сам программировать вообще только начинаю, еще даже не дочитал Марка Лутца (программирвоание на python 4), однако задача передо мной уже встала, притом не простая и как ее реализовать понятия не имею. В общем существуют выхлдные файлы формата *.dat имеющие примерно вот такую структуру:
№ масса x y z vx(ск-ть по х) xy (ск-ть по н) vz (ск-ть z)
000000 1.25000000E-04 5.21462443E-01 1.87714331E-02 1.32428970E+00 -2.32415251E-01 -5.23119019E-01 2.80631315E-01
000001 1.25000000E-04 3.63733470E-01 -2.04553131E-01 2.58420622E-01 1.39289015E-02 -2.13983670E-01 2.88175786E-01

и так далее.. в общем суть поставленной передо мной задачи такова:
1) *.dat файлов может быть тысячи и нужно данные со всех файлов, записать в 1 файл
2) преобразовать в бинарный вид и записат в *.hdf формат для дальнейшей визуализации

у меня получается только прочитать файлы, но вопросы остаются

1) как прочитать 10 файлов и записать все в 1
2) как плученный результат преобразовать в бинарный вид

извиняюсь если вопрос неуместен, и заранее спасибо.

Офлайн

#2 Ноя. 23, 2013 09:07:25

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

преобразование в бинарный вид файла с данными

r1pley
если вопрос неуместен
Не надо стесняться.

1 Если файлов много используйте модуль glob чтобы их найти (естественно не надо читать файлы и потом писать в один. Надо сразу писать в целевой файл. А собрать все в кучу можно так cat *.dat >common.xxx:) )
2 бинарный вид *.hdf это наверное *.h5? Для этого есть модули h5py или pytable.

3.1 как читаете тоже не очень понятно. Проще всего воспользоваться numpy http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html читается файл одной командой и результат получается тот что надо.
3.2 для сборки последовательностей из разных ошметков есть https://pypi.python.org/pypi/pandas. Но думаю вам поначалу это слишком сложно.



Отредактировано doza_and (Ноя. 23, 2013 09:10:49)

Офлайн

#3 Ноя. 23, 2013 09:18:34

r1pley
Зарегистрирован: 2013-11-23
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразование в бинарный вид файла с данными

Спасибо большое, буду пробовать, а читаю вот так, хотя возможно и не правильно..
f=open('000000.dat')
f.readlines()

только вот с cat немного не понял…

cat .dat > main.hdf
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
NameError: name ‘cat’ is not defined

Отредактировано r1pley (Ноя. 23, 2013 09:20:20)

Офлайн

#4 Ноя. 23, 2013 09:19:37

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

преобразование в бинарный вид файла с данными

проще, наверное, добавить заголовки к стобцам в эти файлах и прочесть как csv через pandas. Им же и в hdf можно складывать и считывать обратно, все само проименуется в соотвествии с этими заголовками

Офлайн

#5 Ноя. 23, 2013 09:21:36

r1pley
Зарегистрирован: 2013-11-23
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразование в бинарный вид файла с данными

sergeek
проще, наверное, добавить заголовки к стобцам в эти файлах и прочесть как csv через pandas. Им же и в hdf можно складывать и считывать обратно, все само проименуется в соотвествии с этими заголовками
Хорошо спасибо, буду пробовать)

Офлайн

#6 Ноя. 23, 2013 09:38:18

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

преобразование в бинарный вид файла с данными

да не нужен тут csv

numpy.loadtxt(fname, skiprows=1)
сразу даст результат в виде numpy array

r1pley
cat .dat > main.hdf
Traceback (most recent call last):

Хм. Это была шутка.
cat *.dat >main.hdf
это команда которую можно набрать в командной строке UNIX интерпретатора а не выполнить в питоне. Она просто последовательно свалит в один файл все файлы с расширением dat. Думаю вам это не надо.

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

arr=numpy.loadtxt(fname, skiprows=1)
m=arr[:,0]
x=arr[:,1]
....



Отредактировано doza_and (Ноя. 23, 2013 09:43:24)

Офлайн

#7 Ноя. 23, 2013 10:14:34

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

преобразование в бинарный вид файла с данными

doza_and
да не нужен тут csv
задача тса решается в две строки через pandas.dataframe
In [2]: import pandas
In [3]: with pandas.get_store('db.h5') as db:
   ...:     db['/data'] = pandas.read_csv('asd.dat', sep=' ',header=None, names=['mass', 'x', 'y', 'z', 'vx', 'vy', 'vz'])
   ...:     
In [4]: pandas.HDFStore('db.h5')['/data']
Out[4]: 
       mass         x         y         z        vx        vy        vz
0  0.000125  0.521462  0.018771  1.324290 -0.232415 -0.523119  0.280631
1  0.000125  0.363733 -0.204553  0.258421  0.013929 -0.213984  0.288176

Офлайн

#8 Ноя. 23, 2013 14:55:36

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

преобразование в бинарный вид файла с данными

sergeek
задача тса решается в две строки
Не могу согласиться. Он сначала неделю будет изучать pandas. Но не это главное. pandas.HDFStore сохранит данные в формате pytable. При этом теряется низкоуровневое управление записью доступное в h5py. В моей практике не было ни одного случая когда это было допустимо, причем даже в тех случаях когда я сам формат выбирал. Всегда надо что-то переставить, подлатать, выкинуть, сделать другого типа, выбрать способ компрессии и т.п. Конечно может быть что я ошибаюсь, тогда поправьте. В частности не дошли руки разобраться:
Как происходит буферизация при добавлении данных в pytable?
Есть ли некоммерческие решения по индексации данных в pytable?
Насколько эффективно реализован array[np.where(array > 4)]?

Эти вопросы возникают поскольку никак не могу понять где вообще pytable имеет преимущества перед h5py?



Отредактировано doza_and (Ноя. 23, 2013 15:02:34)

Офлайн

#9 Ноя. 23, 2013 17:47:03

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

преобразование в бинарный вид файла с данными

doza_and
При этом теряется низкоуровневое управление записью доступное в h5py
не понимаю что под этим подразумевается, если
doza_and
Всегда надо что-то переставить, подлатать, выкинуть, сделать другого типа, выбрать способ компрессии и т.п.
то типы можно указать явно при считывании, сжатие при открытии файла, фильтрацию данных тоже можно произвести после считывания
doza_and
Как происходит буферизация при добавлении данных в pytable?
там все просто - данные висят в памяти пока не закроется файл или не вызовется метод flush
doza_and
Есть ли некоммерческие решения по индексации данных в pytable?
Не понял вопрос. Я этот pytables использовал только в качестве дерева массивов с небольшой оберткой.
doza_and
Насколько эффективно реализован array
а причем тут pytables? он ndarray и возвращает при считывании. Или вы про таблицы? Вроде бы все очень эффективно у них Они чуть ли не в каждом абзаце документации хвастаются эффективностью.
doza_and
икак не могу понять где вообще pytable имеет преимущества перед h5py?
http://www.pytables.org/moin/FAQ#HowdoesPyTablescomparewiththeh5pyproject.3F


Офлайн

#10 Ноя. 23, 2013 17:55:11

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

преобразование в бинарный вид файла с данными

sergeek,
ты в курсе, что сейчас Дьявола вызвал?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version