如何在Python中从输出中提取特定信息

如何在Python中从输出中提取特定信息,python,parsing,blender,mocha.js,pyparsing,Python,Parsing,Blender,Mocha.js,Pyparsing,所以我有一个代码可以给出一个输出,我需要做的是在逗号之间提取信息,将它们分配给一个变量,该变量在调用时会动态变化。。。这是我的密码: 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 fi

所以我有一个代码可以给出一个输出,我需要做的是在逗号之间提取信息,将它们分配给一个变量,该变量在调用时会动态变化。。。这是我的密码:

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)等等,这样无论填充这些位置的是什么数字,它们都会取那个值

以下是我需要输入这些数字的代码:

#-------------------------------------------------------------------------------
# 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)
所以我想把向量放在哪里(p.x,p.y,0.z,p.w,p.s),然后(p2.x,p2.y,p2.zp2.wp2.s)等等,这样它就可以根据给定的数字改变

任何帮助都会很好。。提前谢谢你


-jeff

如果我正确地阅读了您的代码,那么相关的部分就是最后生成元组的循环

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

如果我读对了你的代码,那么相关的部分就是产生元组的末端循环

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

而不是打印每个输出,您可以创建点对象并按名称对其进行索引。例如:

>>> 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
附录

如果重要的是不要从数组中提取点,而是使用实际的变量名,则可以执行以下操作,其中
是元组的数组

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

请考虑一下这是否是一个合适的方法。拥有point类允许您拥有任意数量的点。使用已定义的变量名,可以动态创建无限数量的变量,但几乎总是一个坏主意。这里有一个关于这样做的警告:

当您拥有一个点对象阵列时,您可以更好地执行您想要的操作!例如,您可以执行以下操作:

myPoints[i].y = 12
从而改变第i个点的y坐标。当您修复了变量名时,这几乎是不可能的。希望有帮助!(希望我能理解您的解释!如果没有,请告诉我……)

您可以创建点对象并按名称对其进行索引,而不是打印每个输出。例如:

>>> 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
附录

如果重要的是不要从数组中提取点,而是使用实际的变量名,则可以执行以下操作,其中
是元组的数组

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

请考虑一下这是否是一个合适的方法。拥有point类允许您拥有任意数量的点。使用已定义的变量名,可以动态创建无限数量的变量,但几乎总是一个坏主意。这里有一个关于这样做的警告:

当您拥有一个点对象阵列时,您可以更好地执行您想要的操作!例如,您可以执行以下操作:

myPoints[i].y = 12

从而改变第i个点的y坐标。当您修复了变量名时,这几乎是不可能的。希望有帮助!(希望我能理解你的解释!如果没有,请告诉我……)

用Python解析文本其实很容易,但你必须自己想出一个方法。从我的头脑中,我会用在换行符上拆分字符串(使用)来解决这个问题,然后使用str.split和简单检查的组合单独解析每一行。只要文本的格式没有改变,您就可以为这种特定情况编写解析器。用Python解析文本实际上相当简单,但您必须自己想出一个方法。从我的头脑中,我会用在换行符上拆分字符串(使用)来解决这个问题,然后使用str.split和简单检查的组合单独解析每一行。只要文本的格式没有改变,您就可以为这个特定的情况编写解析器。太好了,非常感谢,这样就可以了。。我肯定会让你知道的,但我应该在我的问题中指出我的其他代码,可以在这里找到:,因此,我的目标是从该文件中获取给定的数据点,并能够将它们动态命名为向量,这样它就可以更改每一帧
namedtuple
使点类的创建更加容易:
Point=namedtuple(“Point”,“x y z w s”)
。我不知道这个。太棒了。太好了,非常感谢,应该可以了。。我肯定会让你知道的,但我应该在我的问题中指出我的其他代码,可以在这里找到:,因此,我的目标是从该文件中获取给定的数据点,并能够将它们动态命名为向量,这样它就可以更改每一帧
namedtuple
使点类的创建更加容易:
Point=namedtuple(“Point”,“x y z w s”)
。我不知道这个。太棒了。数据[0][0]保存值0,数据[0][1]保存值,数据[0][2]包含7,etcI应该在我的问题中也注意到我的其他代码,可以在这里找到:pastell.org/23850/python,所以我的目标是获取该文件中给出的数据点,并能够将它们动态命名为向量,这样它就可以更改每个帧,如果点是元组,则不应该发生这种情况。它们是弦吗?如果是这样,则追加步骤将需要某种类型的解析。数据[0][0]保留值0,数据[0][1]保留值,数据[0][2]包含7,etcI还应该在我的问题中注意到我的其他代码,可以在这里找到:pastell.org/23850/python,因此我的目标是获取给定的数据点f