【问题标题】:Splitting text with python用python分割文本
【发布时间】:2016-12-13 00:58:25
【问题描述】:

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

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 -132.644 0

【问题讨论】:

  • 我无法理解您希望单个输出文件的行看起来像什么,以及它与输入文件的不同之处。显示您提供的输入应该是什么。
  • 请看我上面的编辑
  • 这是我之前的问题,但现在我正在尝试做一些不同的事情......

标签: python text split


【解决方案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

【讨论】:

  • 此解决方案有效,但如果我想将结果输出到文本文件怎么办?
【解决方案2】:

您似乎想要一个除数字和空格外的所有内容都被删除的文件。这里有两种解决方案,一种使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2017-12-15
    • 2022-07-06
    • 2011-11-10
    • 1970-01-01
    • 2013-06-16
    • 2019-05-02
    相关资源
    最近更新 更多