Как сохранить переменную списка с несколькими массивами в один файл * .dat в python? - PullRequest
0 голосов
/ 22 октября 2018

Привет всем, я новичок здесь.Сейчас я сталкиваюсь с проблемой, заключающейся в том, что после обработки сигналов я получил объект списка с 436 элементами, каждый элемент является массивом, а их длина колеблется от 1000 до 450 000.Мне нужно сохранить их в файл * .dat, который может быть введен ANN другого коллеги.Вот мои коды:

#pulse_data_list is the mentioned list object
filename = 'F:/work/signal.dat'
file = open(filename , "wb")
file.write(pulse_data_list)
file.close()
print('Data has been saved, dir=',filename)

Они не работают, показывает «Ошибка типа: требуется байтоподобный объект, а не« список »», что мне делать?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Чтобы ответить на ваш конкретный вопрос, вы, вероятно, захотите использовать numpy's savez или savez_compressed .Но тогда не называйте это .dat файлом, называйте это .npz файлом.

Я отвечаю на это, потому что видел несколько вопросов, относящихся к файлам * .dat, как будто это определенный, четко определенный формат.Это не.Я полагаю, что требуется более длинное объяснение, так как комментарии на этот счет, кажется, не дают смысла.

Файл с расширением *.dat обычно указывает, что файл содержит данные, но несоответствует стандартному формату. Следовательно, в каком бы формате вы ни хранили данные, вам понадобится дополнительная документация, чтобы сообщить человеку, который читает файл, как данные представлены в файле.Нет ничего плохого в использовании формата * .dat, но имейте в виду, что часто вы думаете, что не собираетесь использовать данные позже, но потом оказывается, что вы это делаете, и может быть очень трудно восстановить данные, которые хранятся в неизвестномformat.

Например, вот список Wikipedia использования расширения DAT .Обратите внимание, что, за исключением одного, все они являются просто очень специфическими типами файлов данных, и, конечно, универсальный «Файл данных в специальном формате или ASCII» будет тем, что вы видите больше всего.

Вот некоторыерекомендации, которые следует учитывать при выборе формата:

1) Если вы собираетесь использовать стандартный формат, используйте расширение, указывающее этот формат, даже если стандартное расширение отсутствует. Вы не хотите оглядываться назад через 4 года и иметь 1000 различных файлов * .dat в 127 различных форматах.Например, если вы используете формат pickle, назовите файл * .p или * .pickle или что-то в этом роде .Кроме того, с большими массивами вы, вероятно, используете numpy или scipy, и они имеют стандартные выходные форматы, поэтому используйте расширение, которое даст вам предположение о формате (например, * .npd, * .numpydata).

2) Вам нужно решить, есть ли в вашем формате заголовок, например *. Wav audio file .Обычно заголовок представляет собой фиксированное число битов в начале файла, которые сообщают человеку, читающему файл, как хранятся данные.В примере файла * .wav он будет содержать такие вещи, как частота дискретизации и то, являются ли данные стереофоническими или монофоническими.Как показывает файл wav, преимущество заголовка состоит в том, что вы можете хранить больше вариантов данных того же типа.Другой пример заголовка - это то, что он может облегчить хранение нескольких вещей в одном файле, как ваш случай с несколькими массивами, потому что заголовок может сказать, где заканчивается один и начинается следующий.

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

Имея это в виду, если вы хотите записать свой собственный формат файла * .dat:

Если вы хотите использовать ASCII, вы можете использовать стандарт file.write.

Если вам нужен двоичный формат, вы можете использовать стандартный модуль struct .

0 голосов
/ 22 октября 2018

Вы можете использовать lib pickle - сериализацию объектов Python.(https://docs.python.org/3/library/pickle.html)

...