控制我的输出

时间:2011-08-11 19:55:41

标签: python string list tuples pyparsing

以下是代码:

#!/usr/bin/env python
import json
import sys
import os
import parser
sys.path.append('Z:\_protomotion\Prog\HelperScripts')
import GetDir
sys.path.append('Z:/Blender_Roto')
filename = 'diving_board.shape4ae'
infile = 'Z:/Blender_Roto/'
#import bpy
#from mathutils import Vector

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

import re

data_directory = 'Z:/Blender_Roto/' # windows
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.
    print(len(points))
    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)

(p1, p2, p3, p4, p5) = points
print (p1)
#print (p2)
#print (p3)
#print (p4)
#print (p5)

file.close()

这是我的输出:

====init=====
Frames Per Second: 24.0
Source Width: 2048
Source Height: 778
Source Pixel Aspect Ratio: 1
Comp Pixel Aspect Ratio: 1
5
frame: 20
(0.793803,0.136326,0,0.5,0)

从这个输出我希望能够将变量point1y(0.136326)变量(0.793803)变量指向变量point1y(0)变量point1z(0.5)变量变量point1w和(0)变量变量point1s。

所以我不想只输出(0.793803,0.136326,0,0.5,0),而是希望它能单独给出值

这样:

point1x: 0.793803
point1y: 0.136326
point1z: 0
point1w: 0.5
point1s: 0

任何人都知道我该怎么做?

2 个答案:

答案 0 :(得分:2)

这看起来像一个元组,在这种情况下,你想要的python语句是:

point1x, point1y, point1z, point1w = (0.793803,0.136326,0,0.5,0)

答案 1 :(得分:1)

一旦你有points,如果你知道它将始终是逗号分隔的十进制数列表,只需执行以下操作:

points = points.split(",")
# points = ["0.793803","0.136326","0","0.5","0"]
# Now you can use John Gaines suggestion
# to unpack your variables
point1x, point1y, point1z, point1w = points

如果您不知道任何给定条目的解包数量,但您知道最大值,只需在拆分后检查points长度并添加适当数量的None列表中的条目:

# Somewhere earlier
max_entries = 5
# ... snip ...
# points = ["0.793803","0.136326","0"]
cur_len = len(points)
if cur_len > max_entries:
    raise ValueError("%d points discovered in %s.  Max entries is %d" % (cur_len, points, max_entries)
 if cur_len != max_entries:
     points += [None] * (max_entries - cur_len)
 # Continue from here