В каком двоичном формате экспортируется двоичная сетка и как его можно преобразовать в ASCII с помощью Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 В каком двоичном формате экспортируется двоичная сетка и как его можно преобразовать в ASCII с помощью Python?

Сообщение Anonymous »

Я создал несколько больших сеток с помощью Gmsh через API Python. Файлы ASCII могут иметь размер в гигабайтах. Поскольку двоичные файлы меньше по размеру и быстрее читаются, я настроил Gmsh для сохранения файлов сетки в двоичном формате. Моя текущая проблема заключается в том, чтобы выяснить, как прочитать эту двоичную сетку обратно в Python в интерпретируемом формате.
Кроме того, мне нужно, чтобы код был совместим с текущей базой кода, которую я использую. , который ожидает данные ASCII, которые я получаю при сохранении сетки в формате ASCII. Я считаю, что если я смогу прочитать двоичный файл и преобразовать его в ASCII в памяти, я смогу обманом заставить другую библиотеку, которую я использую, использовать ее. Надеюсь, это все равно будет быстрее, чем чтение данных в формате ASCII (хотя я пока не знаю, будет ли это правдой).
Итак, мои вопросы:
  • Какую двоичную кодировку использует Gmsh для файлов сохранения?
    Как можно прочитать файл двоичной сетки обратно в Python и преобразовать в ASCII?< /li>
Вот упрощенная версия кода руководства Gmsh 1 (ссылка), модифицированная для сохранения сетки в ASCII или двоичном формате.

Код: Выделить всё

import gmsh
import sys

binary = True
if binary:
argv = ["","-bin"]
else:
argv = []
gmsh.initialize(argv=argv)

gmsh.model.add("t1")

lc = 1e-2
gmsh.model.geo.addPoint(0, 0, 0, lc, 1)
gmsh.model.geo.addPoint(.1, 0, 0, lc, 2)
gmsh.model.geo.addPoint(.1, .3, 0, lc, 3)
p4 = gmsh.model.geo.addPoint(0, .3, 0, lc)

gmsh.model.geo.addLine(1, 2, 1)
gmsh.model.geo.addLine(3, 2, 2)
gmsh.model.geo.addLine(3, p4, 3)
gmsh.model.geo.addLine(4, 1, p4)

gmsh.model.geo.addCurveLoop([4, 1, -2, 3], 1)
gmsh.model.geo.addPlaneSurface([1], 1)

gmsh.model.geo.synchronize()

gmsh.model.addPhysicalGroup(1, [1, 2, 4], 5)
gmsh.model.addPhysicalGroup(2, [1], name="My surface")

gmsh.model.mesh.generate(2)
if binary:
gmsh.write("t1_binary.msh")
else:
gmsh.write("t1_ascii.msh")
gmsh.finalize()
Мой первоначальный наивный подход заключался в том, чтобы прочитать файл в двоичном формате и попробовать .decode(), но этот подход терпит неудачу, как только он проходит строку $Entities .

Код: Выделить всё

mesh_file = []
with open("t1_binary.msh", "rb") as f:
for line in f.readlines():
print(line)
mesh_file.append(line.decode())
При сбое я получаю сообщение об ошибке UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0x9a в позиции 72: неверный начальный байт.
Я использую Linux и попробовал запустить файл t1_binary.msh, чтобы посмотреть, даст ли это мне какую-нибудь полезную информацию, но все, что я получил, это t1_binary.msh: data (т. е. это не помогло). не предоставляю никакой информации о двоичном формате).

Обработка комментариев:

Вы пробовали просмотреть исходный код gmsh.write()?

Да, я пытался изучить этот код. Функция write gmsh.py (ссылка) вызывает lib.gmshWrite (я думаю, это: ссылка), которая является C++. Эта функция C++ вызывает gmsh::write (я думаю, это: ссылка), которая, похоже, вызывает gmshWrite, совершая полный круг. Я не уверен, что вижу неправильные определения функций.

Какой тип вывода ASCII вы ожидаете? Это двоичные данные, а не текст, верно?

Я ожидаю, что смогу восстановить данные ASCII, сохраненные в t1_ascii.msh, когда я установите для двоичного файла значение False.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ed-to-asci
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»