2015-02-17 6 views
1

У меня есть файл формата "vtu" (для paraview) в виде текста. Формат выглядит следующим образом:извлекать значения и построить новый файл

<?xml version="1.0"?> 
<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian" > 
<UnstructuredGrid> 
<Piece NumberOfPoints="21" NumberOfCells="20" > 
<Points> 
<DataArray type="Float64" Name="coordinates" NumberOfComponents="3" format="ascii" > 
        -3.3333333333e-01 1.1111111111e-01 0.0000000000e+00 
-2.7777777778e-01 1.1111111111e-01 0.0000000000e+00 
-1.1111111111e-01 4.4444444445e-01 0.0000000000e+00 
</DataArray> 
</Points> 
<Cells> 
<DataArray type="UInt64" Name="connectivity" NumberOfComponents="1" format="ascii" > 
     0 1 
2 3 
5 4 

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

21 
-3.3333333333e-01 
1.1111111111e-01 
-2.7777777778e-01 
1.1111111111e-01 
-1.1111111111e-01 
4.4444444445e-01 

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

То, что я узнал до сих пор, очень прост. Для первого файла я могу обнаружить NumberOfPoints линии включена

import xml.etree.ElementTree as ET 
tree = ET.parse('read.vtu') 
root = tree.getroot() 

for Piece in root.iter('Piece'): 
    print Piece.attrib 
    nr = Piece.get('NumberOfPoints') 
    print nr 

Я могу иметь 21 :) Следующий шагом является добавление координат. Но я не знаю, как их разобрать, так как я не могу найти ни одного узла, связанного с ними.

+3

Как очень первый шаг: поскольку это XML-файл, я предлагаю использовать библиотеку xml для его анализа: https://docs.python.org/2/library/xml.etree.elementtree.html –

+1

Добро пожаловать в переполнение стека! Похоже, вы хотите, чтобы мы написали вам код. Хотя многие пользователи готовы создавать код для кодера, терпящего бедствие, они обычно помогают только тогда, когда плакат уже попытался решить проблему самостоятельно. Хорошим способом продемонстрировать это усилие является включение кода, который вы написали до сих пор, пример ввода (если он есть), ожидаемый вывод и вывод, который вы фактически получаете (вывод консоли, трассировки стека, ошибки компилятора - все, что угодно применимо). Чем больше подробностей вы предоставите, тем больше ответов вы получите –

+0

Вы должны использовать красивый суп, чтобы избежать головной боли при разборе xml (если файл короткий) – JoshRomRock

ответ

1

Попробуйте это:

import xml.etree.ElementTree as ET 
try: 
    from cStringIO import StringIO 
except: 
    from StringIO import StringIO 

o = file('out.txt', 'w') 

tree = ET.parse('read.vtu') 
root = tree.getroot() 

for Piece in root.iter('Piece'): 
    nr = Piece.get('NumberOfPoints') 
    o.write(nr+ '\n') 

piece = root.iter('Piece') 
piece = piece.next() 
point = piece.getchildren()[0] 
dataArr = point.getchildren() 
data = dataArr[0] 

# Writing to a buffer 
output = StringIO() 
output.write(data.text) 

# Retrieve the value written 
crds = output.seek(1) 

for l in output: 
    ls = l.split(); 
    o.write(ls[0]+ '\n') 
    o.write(ls[1]+ '\n') 

output.close() 
o.close() 
+0

Тайнс, это работает :) –

0

meshio (проект шахты) знает формат ВТУ, так что вы могли бы просто

pip install meshio 

, а затем

import meshio 
points, cells, _, _, _ = meshio.read('file.vtu') 
Смежные вопросы