2016-12-13 4 views
0

Ich habe ein Python-Skript, das eine Liste von Text liest und es in vier separate Dateien schreibt. Wäre es möglich, nur eine Textdatei zu schreiben, in der jede Linie die gemeinsame Koordinate x Koordinate y Koordinate und z Koordinate getrennt durch Leerzeichen hat? Ich würde schätzen jede HilfeTeilen von Text mit 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() 

Die erste Zeile der Ausgabetextdatei würde wie folgt aussehen: 1 0 -132,644 0

+0

kann ich nicht undestand was Sie Zeilen einer einzigen Ausgabedatei aussehen soll und wie unterscheidet es sich von der Eingabedatei sein würde. Zeigen Sie, was es für die Eingabe sein soll, die Sie geben. –

+0

Siehe meine Bearbeitung oben – user7269405

+0

duplizieren, siehe: http://stackoverflow.com/questions/41109713/split-up-a-text-file-based-on-it-contents –

Antwort

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) 

aus:

['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'] 

oder schreiben zur Datei:

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

oder:

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) 

aus:

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

Diese Lösung funktioniert, aber was, wenn ich die Ergebnisse in eine Textdatei ausgeben wollte? – user7269405

+0

Ich aktualisiere den Code –

0

Es Sie mit allem, was excepts Zahlen und Leerzeichen eliminiert wollen eine Datei angezeigt wird. Hier sind zwei Lösungen, eine mit REs, eine nicht.

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())) 

Dies gibt der folgende zweimal

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 
Verwandte Themen