Найти - Пользователи
Полная версия: преобразование в бинарный вид файла с данными
Начало » Python для новичков » преобразование в бинарный вид файла с данными
1 2 3
sergeek
FishHook
ты в курсе, что сейчас Дьявола вызвал?
неа. Я ничего не понимаю. Что случилось?
sergeek
sergeek
неа. Я ничего не понимаю. Что случилось?
А все, я понял, 666, да.
FishHook
>>>>А все, я понял, 666, да.
Нет
sergeek
FishHook
Нет
Ну почему же? 6 строенных строк же.
Я вообще аттеист
Singularity
FishHook
cложно сразу сказать ?
FishHook
sergeek
Я вообще аттеист
Я тоже,
я просто пошутил: вроде как Ваша
речь для уха незнакомого с терминологией
должна звучать как загробное заклинание.
Не буду больше так шутить, простите.
py.user.next
r1pley
1) как прочитать 10 файлов и записать все в 1

def cat(*fnames, enc='utf-8'):
    for fname in fnames:
        with open(fname, encoding=enc) as fin:
            for line in fin:
                yield line
 
lines = cat('/etc/passwd', '/etc/fstab')
print(*lines, sep='', end='')
это Бизли советовал в своей презентации использовать генераторы для сцепления разных данных


doza_and
это команда которую можно набрать в командной строке UNIX интерпретатора а не выполнить в питоне. Она просто последовательно свалит в один файл все файлы с расширением dat. Думаю вам это не надо.
не последовательно, а в том порядке, в котором найдёт
doza_and
py.user.next
не последовательно, а в том порядке, в котором найдёт
:) с вами согласен, недостаточно четко сформулировано. Кургинян наверное меня уже оштрафовал за это.
Не вижу разницы в вашем и моем утверждениях.
Правильное утверждение - последовательно в том порядке в котором файлы оказались в командной строке команды cat. А дальше это дело того кто их подсовывает. У меня получается так, что и windows и bash суют упорядоченно по алфавиту, не взирая на дату создания, но естественно, на это нельзя полагаться.

Я понимаю что это учебный пример, но:
1 при записи в файл в виде:
import numpy as np
d = np.zeros(3001,dtype='i')
d[:] = np.arange(3001)[:]
d.tofile('samp.dat')

системный cat отрабатывает нормально, а почти ваш (я его под 2.7 перетащил):
Traceback (most recent call last):
File “C:\PROJECTS\br1200\report\catt\ct.py”, line 9, in <module>
for i in cat('samp.dat'):
File “C:\PROJECTS\br1200\report\catt\ct.py”, line 6, in cat
for line in fin:
File “C:\comp\Python27\lib\codecs.py”, line 684, in next
return self.reader.next()
File “C:\comp\Python27\lib\codecs.py”, line 615, in next
line = self.readline()
File “C:\comp\Python27\lib\codecs.py”, line 530, in readline
data = self.read(readsize, firstline=True)
File “C:\comp\Python27\lib\codecs.py”, line 477, in read
newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: ‘utf8’ codec can't decode byte 0x80 in position 152: invalid start byte

Очевидно cat должен читать данные в двоичном режиме.

2
lines = cat('/etc/passwd', '/etc/fstab')
print(*lines, sep='', end='')
Нехорошо советовать новичкам затаскивать все в память. Особенно для cat.
Может лучше так?
for line in cat('/etc/passwd', '/etc/fstab'):
    print(line)

А вообще хороший cat наверное будет сложнее - двоичное чтение, блоками согласованными по размеру с размерами блоков на диске …. Но стоит его изобретать? Он ведь есть.

r1pley
Всем привет, в общем на месте не стоим, пару деньков у меня еще есть, а потом… за одно место подвесить не подвесят…но все же…
В общем что у меня получилось:
1)
import numpy as np
FH = np.loadtxt('000000.dat',comments='#',delimiter=',',skiprows=1)

выдал ошибку:
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
File “/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py”, line 796, in loadtxt
items =
ValueError: could not convert string to float: N mass x y z vx xy vz

после этого убрал значения N, MASS - vz, получил другую ошибку :
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
File “/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py”, line 796, in loadtxt
items =
ValueError: invalid literal for float(): 000000 1.25000000E-04 4.91117057E-01 -4.66076625E-02 1.35605059E+00 -2.52565270E-01 -5.22130810E-01 2.27680536E-01

решил сделать по другому:
import numpy as np

with open('000000.dat') as f:
lines = (line for line in f if not line.startswith('#'))
FH = np.loadtxt(lines, delimiter=',', skiprows=1)

получаю ту же самую ошибку:

ValueError: invalid literal for float(): 000000 1.25000000E-04 4.91117057E-01 -4.66076625E-02 1.35605059E+00 -2.52565270E-01 -5.22130810E-01 2.27680536E-01

в общем мозг кипит, а когда еще не знаешь что делать закипает еще больше……

и еще раз привет, в общем прогресс есть - правда почему понять не могу ,когда имеется одна строка,
000000 1.25000000E-04 4.91117057E-01 -4.66076625E-02 1.35605059E+00 -2.52565270E-01 -5.22130810E-01 2.27680536E-01
то вышеупомянутый код ее читает и не падает, а когда две или более…
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
000002 1.25000000E-04 2.02149760E-01 -7.24248899E-01 -9.13792116E-01 -4.98215981E-01 -3.19786898E-01 -2.58887870E-01


по падает и выдает ошибку…что делать прямо не знаю




r1pley
Часть проблемы решена следующим кодом
import numpy as np
import string
import random
import pandas as pd
with open('t.dat') as f:
	lines = (line for line in f if not line.startswith('#'))
	FH = np.loadtxt(lines, delimiter=',', skiprows=1)
        store = pd.HDFStore('my.h5part',complevel=9, complib='bzip2')

Файл генерится, но не читается так как видимо все коряво… ребят а как теперь объяснить программе, что первый столбец это номер частицы, второй масса, третий-пятый (x, y, z), шетстой-восьмой (скорость по этим координатам)?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB