如何使用python读取文本文件并将特定单词保存到csv或其他文本文件中

2024-04-23 16:21:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,看起来像:

<URProgram createdIn="3.0.0.0" lastSavedIn="3.0.0.0" robotSerialNumber="" name="fix_test" directory="" installation="default">
  <children>
    <MainProgram runOnlyOnce="true">
      <children>
        <Script type="File">
          <cachedContents>
            #fix_test
            #Generated by Robotmaster

            Frame_0 = p[0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000]
            set_tcp(p[0.000000, 0.149000, 0.098500, -1.209200, -1.209200, -1.209200])
            movej([0.000000, -1.570796, -1.570796, 3.141593, -1.570796, 3.141593], a=0.5236, v=0.5236, r=0.002)
            movej(get_inverse_kin(pose_trans(Frame_0, p[0.610000, 0.021012, 0.255841, 2.356194, 0.000000, 0.000000]), [0.676328, -1.397491, -2.205785, 3.603275, -0.894469, 2.356194]), a=0.5236, v=0.5236, r=0.002)
            movej(get_inverse_kin(pose_trans(Frame_0, p[0.610000, 0.013941, 0.248770, 2.356194, 0.000000, 0.000000]), [0.662638, -1.400102, -2.217578, 3.617680, -0.908158, 2.356194]), a=0.5236, v=0.5236, r=0.002)
            movej(get_inverse_kin(pose_trans(Frame_0, p[0.610000, -0.017879, 0.216950, 2.356194, 0.000000, 0.000000]), [0.598347, -1.417498, -2.267414, 3.684913, -0.972450, 2.356194]), a=0.5236, v=0.5236, r=0.002)
            movel(pose_trans(Frame_0, p[0.610000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]), a=0.1, v=0.05, r=0)
            movel(pose_trans(Frame_0, p[0.600000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]), a=0.1, v=0.05, r=0.002)
            movel(pose_trans(Frame_0, p[0.550000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]), a=0.1, v=0.05, r=0.002)
            movel(pose_trans(Frame_0, p[0.540000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]), a=0.1, v=0.05, r=0)
            movel(pose_trans(Frame_0, p[0.540000, -0.017879, 0.216950, 2.356194, 0.000000, 0.000000]), a=0.1, v=0.05, r=0.002)
            movej(get_inverse_kin(pose_trans(Frame_0, p[0.540000, 0.013941, 0.248770, 2.356194, 0.000000, 0.000000]), [0.789221, -1.260062, -2.317786, 3.577848, -0.781575, 2.356194]), a=0.5236, v=0.5236, r=0.002)
            movej(get_inverse_kin(pose_trans(Frame_0, p[0.540000, 0.021012, 0.255841, 2.356194, 0.000000, 0.000000]), [0.804109, -1.258814, -2.304978, 3.563793, -0.766687, 2.356194]), a=0.5236, v=0.5236, r=0.002)
            movej([0.000000, -1.570796, -1.570796, 3.141593, -1.570796, 3.141593], a=0.5236, v=0.5236, r=0.002)
          </cachedContents>
          <file>20201027_185454-fix_test.script</file>
        </Script>
      </children>
    </MainProgram>
  </children>
</URProgram>

我想将其保存为以下内容:

p[0.610000,0.021012,0.255841,2.356194,0.000000,0.000000]

p[0.610000,0.013941,0.248770,2.356194,0.000000,0.000000]

p[0.610000,-0.017879,0.216950,2.356194,0.000000,0.000000]

p[0.610000,-0.023536,0.211293,2.356194,0.000000,0.000000]

p[0.600000,-0.023536,0.211293,2.356194,0.000000,0.000000]

p[0.550000,-0.023536,0.211293,2.356194,0.000000,0.000000]

p[0.540000,-0.023536,0.211293,2.356194,0.000000,0.000000]

p[0.540000,-0.017879,0.216950,2.356194,0.000000,0.000000]

我需要的是TCP位置在每个“movel”行的中间,我如何使用python代码来实现它? 我知道如何读取txt文件并将其拆分为行,但我不知道如何提取特定的单词。 请帮帮我


Tags: testtransgetscriptfixframechildrenkin
2条回答

这里是另一个解决方案,它不太复杂,但也不太健壮

查看您的文件,唯一出现的p[...]是您要提取的文件

因此p\[.*?\]匹配从p[开始直到下一个]的任何内容

import re


FILENAME = "a_file.txt"
pattern = re.compile("p\[.*?\]")


with open(FILENAME,'r') as  file:
    lines = [line.rstrip('\n') for line in file]

for line in lines:
    result=pattern.search(line)

    # if no pattern was found, search outputs None

    if result is not None : 

        print(result.group(0))


#p[0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000]
#p[0.000000, 0.149000, 0.098500, -1.209200, -1.209200, -1.209200]
#p[0.610000, 0.021012, 0.255841, 2.356194, 0.000000, 0.000000]
#p[0.610000, 0.013941, 0.248770, 2.356194, 0.000000, 0.000000]
#p[0.610000, -0.017879, 0.216950, 2.356194, 0.000000, 0.000000]
#p[0.610000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]
#p[0.600000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]
#p[0.550000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]
#p[0.540000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]
#p[0.540000, -0.017879, 0.216950, 2.356194, 0.000000, 0.000000]
#p[0.540000, 0.013941, 0.248770, 2.356194, 0.000000, 0.000000]
#p[0.540000, 0.021012, 0.255841, 2.356194, 0.000000, 0.000000]


如果您可以读取文件并将其拆分为行,那么您只缺少适当的正则表达式,即:

movel.+(p\[([+-]?(\d*[.])?\d+(, )?)+\])

注意:部分[+-]?(\d*[.])?\d+匹配任何浮点数(从here偷来)

详细解释见my saved RegExr

完整示例:

regex = r"movel.+(p\[([+-]?(\d*[.])?\d+(, )?)+\])"
for line in file.splitlines():
    match = re.match(regex, line.strip())
    if match:
        print(match.group(1))

# Output:
# p[0.610000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]
# p[0.600000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]
# p[0.550000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]
# p[0.540000, -0.023536, 0.211293, 2.356194, 0.000000, 0.000000]
# p[0.540000, -0.017879, 0.216950, 2.356194, 0.000000, 0.000000]

您可以随意存储输出或将其写入文件,而不是打印输出

相关问题 更多 >