繁体   English   中英

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

[英]How to read text file and save specific words into csv or another text file using 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]

我需要的是每个“movel”行中间的 TCP position,我如何使用 python 代码来做到这一点? 我知道如何读取 txt 文件并将其拆分为一行,但我不知道如何提取特定的单词。 请帮我!

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

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

注意:部分[+-]?(\d*[.])?\d+匹配任何浮点数(从这里窃取)。

有关详细说明,请参阅我保存的 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]

随意存储 output 或将其写入文件而不是打印。

这是另一种解决方案,它的正则表达式不太复杂,但也不太健壮。

查看您的文件, 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]


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM