python состав и преобразование структурированного массива - PullRequest
0 голосов
/ 03 апреля 2020

Я создал скрипт, который собирает огромные данные из файла .txt в массив в нужном мне формате [3: 4: n], и информация записывается следующим образом (я думаю). Файл .txt имеет следующий формат:

1.000000e-01 1.000000e-01 1.000000e-01

1.000000e-01 2.000000e-01 3.000000e-01

3.000000e-01 2.000000e-01 1.000000e-01

1.000000e-01 2.000000e-01 4.000000e-01

и повторяется в течение N раз, и я сохраняю в основном из 4 строк для линии (например, блок), потому что я работаю с файлами ASCII из частей STL.

В этом смысле у меня есть следующий код:

f = open("camaSTLfinalmente.txt","r")

b_line = 0
Coord = []
Normal = []
Vertice_coord = []
Tri = []
blook = []

for line in f:
line = line.rstrip()
if(line):

    split = line.split()

    for axis in range(0,3):

        if(b_line == 0):                    #normal
            Normal.append(split[axis])
        else:                               #triangulo
            Vertice_coord.append(split[axis])

    if(b_line > 0):
        Tri.append(Vertice_coord)
        Vertice_coord = []

    if(b_line == 3):
        block.append(Normal)
        block.append(Tri)
        Coord.append(block)
        block = []
        Normal = []
        Tri = []
        b_line = 0
    else:
        b_line+=1

print(Coord[0]) #prints the follow line that I wrote after the code

информация хранится следующим образом: [['1.000000e-01', '1.000000e-01', '1.000000e-01'], [['1.000000e-01', '2.000000e-01', '3.000000e-01'], [' 3.000000e-01 ',' 2.000000e-01 ',' 1.000000e-01 '], [' 1.000000e-01 ',' 2.000000e-01 ',' -4.000000e-01 ']]]

Есть ли способ упростить это?

Я хотел бы воспользоваться этой возможностью, чтобы спросить: я хотел преобразовать эту информацию в числа, и в идеале было бы читать число после экспоненты (e). и измените числа соответственно, то есть 1.000000e-01 переходит в 0,1 (в порядке выполнять операции с аналогичным массивом, где я храню информацию из другого файла .txt с таким же форматом)

Спасибо за внимание,

Pedro

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Я не уверен на 100%, полностью ли я понимаю, что вы хотите, но следующий код выдает то же самое Coord:

coord = []
with open('camaSTLfinalmente.txt','r') as f:
    content = [line.strip().split() for line in f]
for i in range(len(content)//4): 
    coord.append([content[4*i], content[(4*i+1):(4*i+4)]]) 

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

s = '1.000000e-01'
n = float(s)
m = '{:.1f}'.format(n)

См. раздел о форматировании строки в Python do c* 1009. *.

Пара замечаний:

  • Обычно Stackoverflow не нравятся вопросы формы «как улучшить этот фрагмент кода», попробуйте задать более конкретный c вопросы.
  • Выше предполагается, что ваш файл содержит 4k строк, соответственно измените целочисленное деление ...//4, если в конце осталось несколько строк, которые не образуют пакет из 4.
  • не используйте заглавные буквы для ваших переменных. Хотя руководства по стилю не являются обязательными, рекомендуется следовать им (см. PEP-8, pylint, ...)
0 голосов
/ 03 апреля 2020

Вы можете попробовать изменить строку split = line.split() на:

split = [float(x) for x in line.split()]

, если вам нужен результат в виде строки, а не типа с плавающей запятой:

split = [str(float(x)) for x in line.split()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...