2011-08-09 112 views
0

所以我有一个给出输出的代码,我需要做的是在逗号之间拉出信息,将它们分配给一个变量,当被调用时动态变化。 ..这里是我的代码:如何从Python中的输出中提取特定信息

import re 

data_directory = 'Z:/Blender_Roto/' 
data_file = 'diving_board.shape4ae' 
fullpath = data_directory + data_file 


print("====init=====") 

file = open(fullpath) 
for line in file: 
current_line = line 

# massive room for optimized code here. 

# this assumes the last element of the line containing the words 
# "Units Per Second" is the number we are looking for. 
# this is a non float number, generally. 
if current_line.find("Units Per Second") != -1: 
    fps = line_split = float(current_line.split()[-1]) 
    print("Frames Per Second:", fps) 

# source dimensions 
if current_line.find("Source Width") != -1: 
    source_width = line_split = int(current_line.split()[-1]) 
    print("Source Width:", source_width) 

if current_line.find("Source Height") != -1: 
    source_height = line_split = int(current_line.split()[-1]) 
    print("Source Height:", source_height) 

# aspect ratios 
if current_line.find("Source Pixel Aspect Ratio") != -1: 
    source_px_aspect = line_split = int(current_line.split()[-1]) 
    print("Source Pixel Aspect Ratio:", source_px_aspect) 

if current_line.find("Comp Pixel Aspect Ratio") != -1: 
    comp_aspect = line_split = int(current_line.split()[-1]) 
    print("Comp Pixel Aspect Ratio:", comp_aspect) 


# assumption, ae file can contain multiple mocha shapes. 
# without knowing the exact format i will limit the script 
# to deal with one mocha shape being animated N frames. 

# this gathers the shape details, and frame number but does not 
# include error checking yet. 
if current_line.find("XSpline") != -1: 

    # record the frame number. 

    frame = re.search("\s*(\d*)\s*XSpline", current_line) 
    if frame.group(1) != None: 
     frame = frame.group(1) 
     print("frame:", frame) 


    # pick part the part of the line that deals with geometry 
    match = re.search("XSpline\((.+)\)\n", current_line) 

    line_to_strip = match.group(1) 
    points = re.findall('(\(.*?\))', line_to_strip) 

    print(len(points)) 
    for point in points: 
     print(point) 
    print("="*40) 

file.close() 

这使我的输出:

====init===== 
Frames Per Second: 24.0 
Source Width: 2048 
Source Height: 778 
Source Pixel Aspect Ratio: 1 
Comp Pixel Aspect Ratio: 1 
frame: 20 
5 
(0.793803,0.136326,0,0.5,0) 
(0.772345,0.642332,0,0.5,0) 
(0.6436,0.597615,0,0.5,0) 
(0.70082,0.143387,0,0.5,0.25) 
(0.70082,0.112791,0,0.5,0) 
======================================== 

所以我需要的例子是能够分配(0.793803,0.136326,0,0.5,0)到(1x,1y,1z,1w,1s),(0.772345,0.642332,0,0.5,0)到(2x,2y,2z,2w,2s)等等,这样无论填入那些p他们将承担这个价值。

这里是我需要把这些数字为代码:

#------------------------------------------------------------------------------- 
# Name:  Mocha Rotoscoping Via Blender 
# Purpose:  Make rotoscoping more efficient 
# 
# Author:  Jeff Owens 
# 
# Created:  11/07/2011 
# Copyright: (c) jeff.owens 2011 
# Licence:  Grasshorse 
#------------------------------------------------------------------------------- 
#!/usr/bin/env python 

import sys 
import os 
import parser 
sys.path.append('Z:\_protomotion\Prog\HelperScripts') 
import GetDir 
sys.path.append('Z:\_tutorials\01\tut01_001\prod\Blender_Test') 
filename = 'diving_board.shape4ae' 
infile = 'Z:\_tutorials\01\tut01_001\prod\Blender_Test' 
import bpy 
from mathutils import Vector 

#below are taken from mocha export 
x_width =2048 
y_height = 778 
z_depth = 0 
frame = 20 

def readText(): 
text_file = open('diving_board.shape4ae', 'r') 
lines = text_file.readlines() 
print (lines) 
print (len.lines) 
for line in lines: 
    print (line) 

##sets points final x,y,z value taken from mocha export for blender interface 

point1x = (0.642706 * x_width) 
point1y = (0.597615 * y_height) 
point1z = (0 * z_depth) 

point2x = (0.770557 * x_width) 
point2y = (0.647039 * y_height) 
point2z = (0 * z_depth) 

point3x = (0.794697 * x_width) 
point3y = (0.0869024 * y_height) 
point3z = (0 * z_depth) 


point4x = (0.707973* x_width) 
point4y = (0.0751348 * y_height) 
point4z = (0 * z_depth) 


w = 1 # weight 
listOfVectors = [Vector((point1x,point1y,point1z)),Vector((point2x,point2y,point2z)),Vector((point3x,point3 y,point3z)),Vector((point4x,point4y,point4z)), Vector((point1x,point1y,point1z))] 

def MakePolyLine(objname, curvename, cList): 
curvedata = bpy.data.curves.new(name=curvename, type='CURVE') 
curvedata.dimensions = '3D' 

objectdata = bpy.data.objects.new(objname, curvedata) 
objectdata.location = (0,0,0) #object origin 
bpy.context.scene.objects.link(objectdata) 

polyline = curvedata.splines.new('POLY') 
polyline.points.add(len(cList)-1) 
for num in range(len(cList)): 
    x, y, z = cList[num] 
    polyline.points[num].co = (x, y, z, w) 

MakePolyLine("NameOfMyCurveObject", "NameOfMyCurve", listOfVectors) 

那么,我有我的载体,我想能够把(PX,PY,0.z,PW,PS)然后(p2.x,p2.y,p2.zp2.wp2.s)等,以便它可以改变每个给定的数字

任何帮助将是伟大的..先谢谢你!

-Jeff

+0

解析Python中的文本其实很简单,但你必须自己想出一个方法。从头开始,我会在新行上分割字符串(使用[str.split](http://docs.python.org/library/stdtypes.html#str.split))来解决这个问题,然后解析每条线分别使用组合str.split和简单检查。只要文本的格式没有改变,你就可以为这个特定的情况编写解析器。 –

回答

3

而不是印刷每个输出,您可以创建点对象和索引它们的名称。例如:

>>> class Point: 
...  def __init__(self, t): 
...   (self.x,self.y,self.z,self.w,self.s) = t 
... 
>>> p = Point((3,4,5,3,1)) 
>>> p.w 
3 

您可以在阵列中放置这些点对象,然后通过

myPoints[3].x 

附录

访问组件若拉是你重要从一个数组中取点,而是用实际变量名,你可以做到以下几点,其中points是你的阵列元组的:

(p0x,p0y,p0z,p0w,p0s) = points[0] 
(p1x,p1y,p1z,p1w,p1s) = points[1] 
(p2x,p2y,p2z,p2w,p2s) = points[2] 
... 

等。

不过要考虑这是否是一种合适的方法。有一个积分类可以让你有任意数量的积分。使用已定义的变量名称,即时创建无限数量的这些东西是可能的,但几乎总是一个坏主意。这里有一个警告:http://mail.python.org/pipermail/tutor/2005-January/035232.html

当你有一个点对象的数组,你做你想要的更好!例如,您可以执行以下操作:

myPoints[i].y = 12 

从而更改第i个点的y坐标。当你修改变量名时,这几乎是不可能的。希望有所帮助! (并希望我明白你的澄清!让我知道如果不是....)

+0

太棒了,非常感谢你,应该做的伎俩..我会让你知道,虽然 – Jeff

+0

我应该也在我的问题中注意到我可以在这里找到的其他代码:http:// www。 pasteall.org/23850/python,所以我的目标是获取从该文件给出的数据点,并能够动态地将它们命名为向量,以便每帧更改 – Jeff

+0

我将更新答案 –

0

如果我在读你的代码的权利,相关部分是在产生的元组结束循环。

data = [] 
for point in points: 
    data.append(point)  
    print(point) 

这将创建一个新列表并将每个元组添加到列表中。因此,data[0]拥有(0.793803,0.136326,0,0.5,0)data[0][0]拥有0.793803

+0

数据[0] [0]保持值0,数据[0] [1]成立。 ,数据[0] [2]成立7等 – Jeff

+0

我应该在我的问题中注意到我可以在这里找到的其他代码:pasteall.org/23850/python,所以我的目标是获取给定的数据点从那个文件,并能够动态地命名为矢量,所以它改变每一帧 – Jeff

+0

如果点是元组,则不应该发生。他们是字符串吗?如果是这样,那么追加步骤将需要某种类型的解析。 –

相关问题