【问题标题】:parsing blocks of text within a text file (blocks separated by empty line)解析文本文件中的文本块(由空行分隔的块)
【发布时间】:2017-04-14 21:04:16
【问题描述】:

我是一个全新的 Python 用户,想要解析如下所示的文本文件:

$ begin
$ vertex -1285.6 -226.2 -538.7 0
$ track 11 1000 0.7277 0.6765 0.1133 0
$ end

$ begin
$ vertex -1265.3 573.1 1547.7 0
$ track 11 1000 -0.7679 0.1650 0.6189 0
$ end

对于每个块 ($ begin ... $ end) 我想获取顶点坐标 x y z:

$ begin
$ vertex x y z 0
$ track 11 1000 -0.7679 0.1650 0.6189 0
$ end

有人可以建议一种方法吗? 我非常感谢任何帮助或建议!

【问题讨论】:

  • 遍历第一列并检查顶点。如果找到顶点,则获取您的坐标并将其存储在列表中。
  • 您好 Teja,感谢您的建议。如果对你来说工作量不大,你能提供一个代码示例吗?

标签: python python-2.7 python-3.x text-parsing string-parsing


【解决方案1】:

你可以在这里使用正则表达式。

patern = re.compile("\n\n")
print patern.split(content)

说明:这将在您的字符串中查找两个连续换行符的模式,并使用该模式拆分为数组

例如:

   with open('data.txt', 'r') as myfile:
       str=myfile.read()
       #str="hello world \n line 1 \n line 2 \n\n line 3 line 4 \n line 5"
       print str
       patern = re.compile("\n\n")
       print patern.split(str)

结果: ['你好世界\n第1行\n第2行','第3行第4行\n第5行']

【讨论】:

  • 嗨,alpeshpandya,谢谢!你能解释一下这是做什么的吗?我有点困惑。能不能举个例子?
  • 添加说明和示例
【解决方案2】:

假设您有一个名为 my file.txt 的文本文件,其中包含您的数据。 让我们为行中的每个项目添加标签:

marker = $
label = vertex OR track OR begin, etc
x = your x value
y = your y value
z = your z value
eol = the last value on the vertex line

当我们阅读每一行时,我们可以检查该行是否包含术语“顶点”。

如果是这样,我们然后使用 split 函数拆分该行(默认情况下,split 将在空白处拆分,但让我们明确地调用我们想要拆分的内容(即。'')。Split 产生一个元素列表.

我们可以使用元组解包将每个项目从列表中拆分出来,并为它们分配单独的标签,这样我们的代码就更具可读性。然后我们可以打印这些值。在您的情况下,您可能希望保存或处理这些值......只需将 print 语句替换为您的处理代码。

file = open('myfile.txt')
for line in file:
    if 'vertex' in line:
        fields = line.split(' ')
        marker, tag, x, y, z, eol = fields
        print(x, y, z)

【讨论】:

  • 太棒了,谢谢!!!我给你打勾是因为你解释得这么清楚。
【解决方案3】:
import csv

with open('data.txt','r') as f:
     text = f.readlines()
for line in text:
    if 'vertex' in line:
        fields = line.split(' ')
        print(fields[2],fields[3],fields[4]) 

【讨论】:

  • 为什么要导入 csv?
【解决方案4】:

略带甜美的触感或re

import re
verticies = re.findall('\$ vertex (\S+) (\S+) (\S+) 0', open('t.data').read())
print verticies

给予:

[('-1285.6', '-226.2', '-538.7'), ('-1265.3', '573.1', '1547.7')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多