1

我有一个大的 txt 文件,其中包含如下数据块:

AB x u z

1  0.00 1.00 4.23

2  0.34 2.33 1.44

3  4.23 3.55 6.22

AC x u z



AB x u z

1  0.88 1.00 4.27

2  0.36 2.33 1.44

3  4.23 3.55 6.22

AC x u z



AB x u z

1  0.66 1.77 8.23

2  0.44 2.33 1.44

3  4.23 3.55 6.44

AC x u z



AB x u z

1  0.44 1.99 8.22

2  0.34 2.33 1.44

3  4.23 3.55 6.22

AC x u z

我正在使用 Python 2.7(该语言的新手),我只需要提取“AB xu z”和“AC xu v”行之间的行,例如第三个数据块,然后将这些行打印到另一个文件。

4

3 回答 3

2

您可以尝试以下方法:

stored = []
with open("test.py") as f:
    for line in f:
        if line.startswith("AB x u z"):
            block = []
        elif line.startswith("AC x u z"):
            stored.append(block)
        else:
            block.append(line)

这个想法是构建一个块列表 ( stored),每个块包含 和 之间的"AB x u z""AC x u z"。请注意,您可能希望通过使用摆脱空行

elif line.strip():
    block.append(line)

作为最后的测试。

因为我们使用的是for...循环,所以我们不会将整个文件加载到内存中(如果文件很大,这可能是个问题)。该with...语句将在读取时自动关闭您的文件。

编辑 正如评论中指出的那样,stored最终会将整个文件保存在内存中。然而,如果你只需要存储一些特定的块,你总是可以使用一个计数器,每次你找到一个结束行时你都会增加一个计数器"AC x u z":如果这个计数器的值满足给定的要求,比如说counter=3,存储块,否则继续迭代。

于 2012-09-23T12:54:01.493 回答
1

@paulc,你可能已经解决了这个问题,但我只是想分享我的代码是一个“新人”

BLOCK_THREE = '3'
outStr = ""

# Read Data File
with open('rough_data.txt', 'r') as srcFile:
    for lnReader in srcFile:
        if lnReader.startswith(BLOCK_THREE):
            outStr += lnReader # lnReader reads each line as a String
        else:
            pass

# Write Data to a file
ofile = open('extracts2.txt', 'w')
ofile.write(u'' + outStr)
ofile.close()
print 'end'
于 2013-01-14T11:01:15.097 回答
0
F = open ('yourfile.txt', 'r')

data = F.read.split('\n\n') #Assuming that there's two newlines between every 'block'

这将为您提供一个列表(数据),在列表的每个位置都包含一个“块”。

于 2012-09-23T12:47:04.157 回答