解析文本文件中的文本块(由空行分隔的块)

时间:2017-04-14 21:04:16

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

我是一个全新的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

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

4 个答案:

答案 0 :(得分:2)

您可以在此处使用正则表达式。

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

说明:这将查找字符串中两个连续的新行字符的patern,并将其拆分为具有该模式的数组

例如:

   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)

结果:     ['hello world \ n line 1 \ n line 2','line 3 line 4 \ n line 5']

答案 1 :(得分:2)

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

$typeDefinition = @"
using System;
using System.Net;
public class FtpClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        FtpWebRequest ftpWebRequest = base.GetWebRequest(address) as FtpWebRequest;
        ftpWebRequest.EnableSsl = true;
        return ftpWebRequest;
    }
}
"@

Add-Type -TypeDefinition $typeDefinition
$ftpClient = New-Object FtpClient
$ftpClient.UploadFile("ftp://your-ftp-server/yourfile.name", "C:\YourLocalFile.name")

在我们阅读每一行时,我们可以检查该行是否包含术语' vertex'。

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

短暂而甜蜜的触摸或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')]