Формат PKL, а не открытый

Обновлено: 07.07.2024

Автопредложение помогает быстро сузить результаты поиска, предлагая возможные совпадения по мере ввода.

Импорт PKL-файла Python в LabVIEW

Импорт файла Python PKL в LabVIEW

  • Отметить как новое
  • Добавить в закладки
  • Подписаться
  • Отключить звук
  • Отправить сообщение другу

Я наткнулся на набор данных, упакованный в формат PKL, погуглил и выяснил:

Файл PKL — это файл, созданный pickle, модулем Python, который позволяет сериализовать объекты в файлы на диске и десериализовать их обратно в программу во время выполнения. Он содержит поток байтов, который представляет объекты. Больше информации . Процесс сериализации называется "маринованием", а десериализация — "распаковыванием".

Я не уверен, можно ли импортировать эти файлы в LabVIEW? Мне удобнее обрабатывать данные в LabVIEW.

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

Заголовок файла выглядит следующим образом:

ГердВ

‎01.03.2021 01:02

  • Отметить как новое
  • Добавить в закладки
  • Подписаться
  • Отключить звук
  • Отправить сообщение другу
@jiangliang написал:

Файл PKL — это файл, созданный pickle, модулем Python, который позволяет сериализовать объекты в файлы на диске и десериализовать их обратно в программу во время выполнения.

Я не уверен, можно ли импортировать эти файлы в LabVIEW? Мне удобнее обрабатывать данные в LabVIEW.

Думаю, вам нужно прочитать документацию по этому модулю Pickle, чтобы узнать о параметрах, которые есть в LabVIEW, чтобы «распаковать» ваши «объекты» данных…

с использованием LV2016/2019/2020 на Win8.1/10+cRIO

‎01.03.2021 02:16

  • Отметить как новое
  • Добавить в закладки
  • Подписаться
  • Отключить звук
  • Отправить сообщение другу

Я знаю, что в начале маринованных данных хранится имя класса (чтение типа данных) маринованных данных. Это необходимо для того, чтобы модуль pickle автоматически знал, как «распаковать» двоичные данные, хранящиеся в файле.

Поэтому похоже, что ваши данные собираются в многомерный массив numpy. Поэтому у меня возникло бы искушение преобразовать ваш файл pkl в файл csv с помощью python, а затем выполнить обработку данных в LV. Вы пишете этот код преобразования, а затем вызываете его в LV, если хотите.

Если ваши данные представляют собой не просто многомерный массив или если они имеют более двух измерений, очевидно, это не будет просто случаем преобразования в файл CSV. Как вы будете переводить свои данные, зависит от вас.

Я уверен, что при достаточном чтении вы могли бы прочитать файл pickle прямо в LV, если это абсолютно необходимо. Сложность этого будет зависеть от того, как класс numpy на самом деле хранит данные и насколько рассольник запутывает данные.

 ambily c

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

1 комментарий

 кк

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Ответы (2)

 Тим Р

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

Вот быстрое решение, основанное на ссылках, при условии, что вы настроили Matlab так, чтобы он указывал на правильную версию Python и библиотеки:

Содержимое данных необходимо будет преобразовать из соответствующих классов Python в те, которые используются в Matlab. Например, если данные представляют собой список, преобразуйте их в ячейку:

8 комментариев

 кк

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

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

 Уолтер Роберсон

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 кк

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Сэр, спасибо и вам, но это не работает в Matlab. и теперь нет необходимости в этом файле рассола. Требуется только этот файл пути,

 Quan minhquanccna

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Я попытался загрузить pickle с обученной моделью XGBoost в Python с помощью той же команды, что и выше. Однако я получил сообщение об ошибке:

Ошибка Python: XGBoostLibraryNotFound: не удается найти библиотеку XGBoost в пути-кандидате. Список кандидатов:

 Уолтер Роберсон

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

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

 Quan minhquanccna

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий


Я также следую этому руководству, чтобы установить xgboost и работать с MATLAB. Но проблема осталась.

 Юнь Гуань

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Я использую " data=py.pickle.load(fid) " для чтения данных pckl, но он показывает "Ошибка Python ModuleNotFoundError: Нет модуля с именем "numpy"". У вас есть идеи? спасибо

 Дев Сарма

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 Ян

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

2 комментария

 кк

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 Уолтер Роберсон

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Вторая ссылка показывает несколько строк Python, необходимых для чтения файлов и преобразования их во что-то, что можно использовать в MATLAB.

Формат данных, используемый pickle, зависит от Python. Это имеет то преимущество, что нет ограничений, налагаемых внешними стандартами, такими как JSON или XDR (которые не могут представлять совместное использование указателей); однако это означает, что программы, отличные от Python, могут быть не в состоянии реконструировать замаринованные объекты Python.

Таким образом, у вас есть наборы данных, специфичные для Python, и вам будет сложно реконструировать данные без использования Python.

Рассмотрите ситуацию, когда информация хранится в файле, и вы написали программу Python для чтения этого файла и выполнения над ним некоторой операции. Если содержимое файла регулярно изменяется, обычно нет другого выхода, кроме как читать файл каждый раз, когда вы запускаете свою программу. Но если содержимое файла не меняется очень часто, может оказаться целесообразным хранить данные в форме, которую Python будет легче читать, чем обычный текст. Модуль pickle берет любой объект Python и записывает его в файл в формате, который Python впоследствии может эффективно считывать обратно в память. В системах, которые его поддерживают, также будет модуль cPickle, который реализован на языке программирования C и, как правило, будет намного быстрее, чем реализация Python; Я буду ссылаться на модуль cPickle в следующих примерах. Особенно в тех случаях, когда необходимо выполнить большой объем обработки набора данных для создания нужных вам объектов Python, травление часто может значительно ускорить работу ваших программ. В более широком плане использование базы данных может быть более подходящим решением для достижения сохраняемости.Но метод травления очень прост и подходит для решения многих проблем.

Процесс травления состоит из двух шагов: во-первых, объект Pickler создается с помощью вызова функции Pickler. Вы передаете этой функции файловый (или файлоподобный) объект, такой как возвращаемый встроенной функцией открытия. (См. раздел 5.4). Если вы передадите Pickler второй аргумент 1 , он запишет маринованный объект в более эффективном двоичном формате вместо стандартного удобочитаемого формата. Создав объект Pickler, теперь вы можете вызвать метод дампа, чтобы замариновать объект по вашему выбору. На этом этапе вы можете вызвать метод close для файлового объекта, переданного Pickler, или вы можете позволить Python закрыть файл, когда ваша программа завершает работу.

В качестве простого примера рассмотрим словарь, элементами которого являются словари, содержащие информацию о сотрудниках компании. Конечно, реальная польза от травления возникает, когда вы создаете объекты из какого-то большого внешнего источника данных, но эта программа покажет основное использование модуля: Когда словарь сотрудников нужен в другой программе, все, что нам нужно сделать, это откройте файл, содержащий маринованный объект, и используйте функцию загрузки модуля cPickle:

Pickling может предложить особенно привлекательную альтернативу базам данных, если вы создали класс, представляющий сложную структуру данных. (Раздел 10.4).


Маринование – это популярный способ консервирования продуктов. Согласно Википедии, это также довольно древняя процедура — хотя происхождение маринования неизвестно, древние жители Месопотамии, вероятно, использовали этот процесс 4400 лет назад. Поместив продукт в определенный раствор, можно резко увеличить срок его хранения. Другими словами, это метод, который позволяет нам хранить пищу для последующего употребления.

Если вы являетесь разработчиком Python, однажды вам может понадобиться способ хранения объектов Python для последующего использования. Что если я скажу вам, что вы тоже можете обрабатывать объекты Python?

Сериализация

Сериализация — это процесс преобразования объектов или структур данных в потоки байтов или строки. Поток байтов — это, ну, поток байтов — один байт состоит из 8 битов нулей и единиц. Эти потоки байтов могут быть легко сохранены или переданы. Это позволяет разработчикам сохранять, например, данные конфигурации или прогресс пользователя, а затем сохранять их (на диске или в базе данных) или отправлять в другое место.

Объекты Python также можно сериализовать с помощью модуля Pickle.

Одним из основных различий между маринованием объектов Python и маринованием овощей является неизбежное и необратимое изменение вкуса и текстуры маринованных продуктов. Между тем, консервированные объекты Python можно легко восстановить до их первоначальной формы. Между прочим, этот процесс широко известен как десериализация.

Не следует путать травление (или сериализацию в целом) со сжатием. Целью травления является перевод данных в формат, который можно перенести из ОЗУ на диск. Сжатие, с другой стороны, представляет собой процесс кодирования данных с использованием меньшего количества битов (для экономии места на диске).

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

Pickle и JSON

Возможно, вы слышали о JSON (нотация объектов JavaScript) — популярном формате, который также позволяет разработчикам сохранять и передавать объекты, закодированные в виде строк. Этот метод сериализации имеет некоторые преимущества перед травлением. Формат JSON удобочитаем, не зависит от языка и быстрее, чем pickle.

Однако у него есть и некоторые важные ограничения. Самое главное, что по умолчанию JSON может представлять только ограниченное подмножество встроенных типов Python. С помощью Pickle мы можем легко сериализовать очень широкий спектр типов Python и, что важно, пользовательские классы. Это означает, что нам не нужно создавать пользовательскую схему (как мы делаем для JSON) и писать подверженные ошибкам сериализаторы и синтаксические анализаторы. Pickle сделает за вас всю тяжелую работу.

Что можно мариновать и не мариновать

С помощью модуля Pickle можно сериализовать и десериализовать следующие типы:

  • Все собственные типы данных, поддерживаемые Python (логические значения, None, целые числа, числа с плавающей запятой, комплексные числа, строки, байты, массивы байтов)
  • Словари, наборы, списки и кортежи, если они содержат объекты, которые можно выбрать.
  • Функции и классы, определенные на верхнем уровне модуля

Важно помнить, что травление не является независимым от языка методом сериализации, поэтому ваши консервированные данные можно распаковать только с помощью Python. Более того, важно убедиться, что объекты декодированы с использованием той же версии Python, которая будет использоваться для их распаковки. Смешение версий Python в этом случае может вызвать много проблем.

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

Также очень важно отметить, что замаринованные объекты могут быть использованы злонамеренно. Например, извлечение данных из ненадежного источника может привести к выполнению вредоносного кода.

Выбор списка Python

В следующем очень простом примере показаны основы использования модуля Pickle в Python 3:

Во-первых, мы должны импортировать модуль pickle, что делается в строке 1. В строке 3 мы определяем простой список из трех элементов, который будет обработан.

В строке 5 мы указываем, что имя нашего выходного файла pickle будет test_pickle.pkl . Используя опцию wb, мы сообщаем программе, что хотим записать ( w ) двоичные данные ( b ) внутри нее (потому что мы хотим создать поток байтов). Обратите внимание, что расширение pkl не обязательно — мы используем его в этом руководстве, потому что это расширение включено в документацию Python.

В строке 6 мы используем метод pickle.dump(), чтобы выбрать наш тестовый список и сохранить его в файле test_pickle.pkl.

Рекомендую вам попробовать открыть сгенерированный файл pickle в текстовом редакторе. Вы быстро заметите, что поток байтов определенно не является удобочитаемым форматом.

Распаковка списка Python

Теперь давайте распакуем содержимое тестового файла pickle и вернем нашему объекту его первоначальную форму.

Как видите, эта процедура не сложнее, чем когда мы травили объект. В строке 3 мы снова открываем наш файл test_pickle.pkl, но на этот раз наша цель — прочитать ( r ) хранящиеся в нем двоичные данные ( b ).

Далее, в строке 5, мы используем метод pickle.load(), чтобы распаковать наш список и сохранить его в переменной unpickled_list.

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

Выделение и удаление пользовательских объектов

Как я упоминал ранее, с помощью Pickle вы можете сериализовать свои собственные объекты. Взгляните на следующий пример:

Как видите, этот пример почти так же прост, как и предыдущий. Между строками 3 и 7 мы определяем простой класс, который содержит один атрибут и один метод, изменяющий этот атрибут. В строке 9 мы создаем экземпляр этого класса и сохраняем его в переменной огурца, а в строке 10 мы устанавливаем цвет его атрибута на «зеленый».

Затем, используя те же самые функции, что и в предыдущем примере, мы маринуем и распаковываем только что созданный объект-огурец. Выполнение приведенного выше кода приводит к следующему выводу:

Бесплатная электронная книга: Git Essentials

Ознакомьтесь с нашим практическим руководством по изучению Git, включающим передовые практики, общепринятые стандарты и памятку. Перестаньте гуглить команды Git и на самом деле изучите их!

Помните, что мы можем распаковать объект только в среде, в которой класс Veggy либо определен, либо импортирован. Если мы создадим новый скрипт и попытаемся распаковать объект без импорта класса Veggy, мы получим «AttributeError». Например, выполните следующий скрипт:

В выводе скрипта выше вы увидите следующую ошибку:

Заключение

Как видите, благодаря модулю Pickle сериализация объектов Python довольно проста. В наших примерах мы выбрали простой список Python, но вы можете использовать точно такой же метод для сохранения большого спектра типов данных Python, если вы убедитесь, что ваши объекты содержат только другие объекты, которые можно выбрать.

У пиклинга есть некоторые недостатки, самым большим из которых может быть тот факт, что вы можете распаковывать свои данные только с помощью Python. Если вам нужно межъязыковое решение, JSON, безусловно, лучший вариант. И, наконец, помните, что pickles можно использовать для переноса кода, который вы не обязательно хотите выполнять. Как и в случае с маринованными продуктами, если вы получаете маринованные огурцы из надежных источников, все будет в порядке.

Читайте также: