2016-12-13 95 views
0

我有一个python脚本,它读取文本列表并将其写入四个独立的文件。是否有可能只写一个文本文件,每行有关节坐标x坐标y坐标和z坐标以空格分隔?我将不胜感激任何帮助使用python分割文本

import os 
os.chdir('/Users/JP/DevEnv/ASA') 


import re 

# regex to extract data line  
r = re.compile(r"\s*(\d+)\s+X=(\S+)\s+Y=(\S+)\s+Z=(\S+)") 

a="""SYSTEM 

    DOF=UY,UZ,RX LENGTH=FT FORCE=Kip 

    JOINT 
    1 X=0 Y=-132.644 Z=0 
    2 X=0 Y=-80 Z=0 
    3 X=0 Y=-40 Z=0 
    4 X=0 Y=0 Z=0 
    5 X=0 Y=40 Z=0 
    6 X=0 Y=80 Z=0 
    7 X=0 Y=132.644 Z=0""".splitlines().__iter__() 

    # open all 4 files with a meaningful name 
    files=[open("file_{}.txt".format(x),"w") for x in ["J","X","Y","Z"]] 
    for line in a: 
     m = r.match(line) 
     if m: 
      # line matches: write in all 4 files (using zip to avoid doing 
      # it one by one) 
      for f,v in zip(files,m.groups()): 
       f.write(v+"\n") 

    # close all output files now that it's done 
    for f in files: 
     f.close() 

输出文本文件的第一行是这样的: 1 0 0 -132.644

+0

我不能你已了解想要一个输出文件的线条看起来像,以及如何将输入文件不同。显示应该为您输入的内容。 –

+0

请参阅我上面的编辑 – user7269405

+0

重复,请参阅:http://stackoverflow.com/questions/41109713/split-up-a-text-file-based-on-its-contents –

回答

1
import re 
a="""SYSTEM 

    DOF=UY,UZ,RX LENGTH=FT FORCE=Kip 

    JOINT 
    1 X=0 Y=-132.644 Z=0 
    2 X=0 Y=-80 Z=0 
    3 X=0 Y=-40 Z=0 
    4 X=0 Y=0 Z=0 
    5 X=0 Y=40 Z=0 
    6 X=0 Y=80 Z=0 
    7 X=0 Y=132.644 Z=0""" 
# replace all character except digit, '-', '.' and ' '(space) with nothing, get all the info you need, than split each info into a list 
b = re.sub(r'[^\d\. -]','',a).split() 
# split the list to sublists, each contain four elements 
lines = [b[i:i+4] for i in range(0, len(b), 4)] 
for line in lines: 
    print(line) 

出来:

['1', '0', '-132.644', '0'] 
['2', '0', '-80', '0'] 
['3', '0', '-40', '0'] 
['4', '0', '0', '0'] 
['5', '0', '40', '0'] 
['6', '0', '80', '0'] 
['7', '0', '132.644', '0'] 

或写至档案:

print(' '.join(line),file=open('youfilename', 'a')) 

或:

with open('filename', 'w') as f: 
    for line in lines: 
     f.write(' '.join(line) + '\n') 
    # or 
    f.writelines(' '.join(line)+'\n' for line in lines) 

出来:

1 0 -132.644 0 
2 0 -80 0 
3 0 -40 0 
4 0 0 0 
5 0 40 0 
6 0 80 0 
7 0 132.644 0 
+0

这个解决方案正在工作,但如果我想输出结果到文本文件呢? – user7269405

+0

我更新了代码 –

0

看样子你想消除一切节选数字和空格的文件。这里有两个解决方案,一个使用RE,一个不使用。

a="""SYSTEM 

    DOF=UY,UZ,RX LENGTH=FT FORCE=Kip 

    JOINT 
    1 X=0 Y=-132.644 Z=0 
    2 X=0 Y=-80 Z=0 
    3 X=0 Y=-40 Z=0 
    4 X=0 Y=0 Z=0 
    5 X=0 Y=40 Z=0 
    6 X=0 Y=80 Z=0 
    7 X=0 Y=132.644 Z=0""".splitlines() 

for line in a: 
    line = line.strip() 
    if line and line[0].isdecimal(): 
     print((''.join(c for c in line if c.isdecimal() or c in '- .') 
       .replace(' ', ' '))) 

print() 
import re 
r = re.compile(r"\s*(\d+)\s+X=(\S+)\s+Y=(\S+)\s+Z=(\S+)") 
for line in a: 
    m = r.match(line) 
    if m: 
     print(' '.join(n for n in m.groups())) 

这将打印以下两次

1 0 -132.644 0 
2 0 -80 0 
3 0 -40 0 
4 0 0 0 
5 0 40 0 
6 0 80 0 
7 0 132.644 0