запись двоичных данных с помощью tobytes () не может быть прочитана с помощью программного обеспечения в Windows - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь записать некоторые данные точек xyz в файл .ply, используя python.

Я использую здесь этот скрипт, который в основном записывает pandas DataFrame в двоичный формат с помощью метода повторного ввода и numpy tobytes():

import pandas as pd
import numpy as np

pc = pd.read_csv('points.txt')

with open('some_file.ply', 'w') as ply:

    ply.write("ply\n")
    ply.write('format binary_little_endian 1.0\n')
    ply.write("comment Author: Phil Wilkes\n")
    ply.write("obj_info generated with pcd2ply.py\n")
    ply.write("element vertex {}\n".format(len(pc)))
    ply.write("property float x\n")
    ply.write("property float y\n")
    ply.write("property float z\n")
    ply.write("end_header\n")

    pc[['x', 'y', 'z']] = pc[['x', 'y', 'z']].astype('f4')

    ply.write(pc[['x', 'y', 'z']].to_records(index=False).tobytes())

Этот скрипт работаетхорошо на моем Mac и программное обеспечение, как CloudCompare может прочитать его;однако, когда я использую тот же сценарий на компьютере с Windows, CloudCompare может читать информацию заголовка, но маркирует двоичный контент.

Когда я читаю версию текстового файла в CloudCompare и выводит в виде двоичного файла как Linux, так и Windowsверсии могут его читать, но содержимое файла отличается.

Здесь - версия, созданная с помощью вышеуказанного сценария, здесь - версия, созданная CloudCompare для Windows. здесь - необработанные данные.

1 Ответ

0 голосов
/ 03 октября 2019

Разница между made_with_code.ply и made_with_windows.ply заключается в том, что в последнем случае все десятичные дроби округляются до 2 десятичных, как вы можете видеть с помощью:

with open('windows.ply', 'rb') as f:
    np.core.records.fromfile(f, formats='f4,f4,f4,f4')

после извлечения части данных с помощью tail -c +274 made_with_windows.ply > windows.ply.

Следующий код создает файл, идентичный (в части данных) made_with_windows.ply:

import pandas as pd
import numpy as np

pc = pd.read_csv('points.txt')

with open('made_with_code_new.ply', 'wb') as ply:
    ply.write("ply\n")
    ply.write('format binary_little_endian 1.0\n')
    ply.write("comment Author: Phil Wilkes\n")
    ply.write("obj_info generated with pcd2ply.py\n")
    ply.write("element vertex {}\n".format(len(pc)))
    ply.write("property float x\n")
    ply.write("property float y\n")
    ply.write("property float z\n")
    ply.write("end_header\n")

    pc[['x', 'y', 'z', 'n']] = pc[['x', 'y', 'z', 'n']].round(2).astype('f4')

    ply.write(pc[['x', 'y', 'z', 'n']].to_records(index=False).tobytes())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...