重新组合文本文件的行

时间:2016-07-21 18:23:41

标签: python sorting

我正在使用Python脚本生成一些Stata命令。输出是一个文本文件。我想使用Python对属于同一观察的行进行分组,目前情况并非如此。

此文件中的典型行(我们称之为file.txt)属于以下类别:

[something something] if a == 1 & b == 2 & c == 3 & [other things]

其中a,b和c是识别变量。 (a,b,c)三元组唯一地标识观察。我想要做的是通过将与同一观察相关的所有行分组在一起来对file.txt进行排序。

例如,请从:

replace k = 1 if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python"

replace k = 2 if a == 1 & b == 3 & c == 4 & comments_1 == ""

replace g = "Example" if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python"

为:

replace k = 1 if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python"


replace g = "Example" if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python"


replace k = 2 if a == 1 & b == 3 & c == 4 & comments_1 == ""

输入的第1行和第3行在输出中彼此相邻,因为它们与相同的观察(相同的a,b,c三联体)有关。这与按字母顺序排序不同,因此我不能使用sort()。

我的计划是:

  

创建一个空字典dict [tuple [int]:set [str]]

     

阅读文本文件的每一行。对于每一行,通过搜索'a =='之后和'b =='之前的字符来获取三元组,依此类推。

     

如果三元组在字典中,则将该行添加为三元组指向的集合中的字符串。如果没有,请创建条目并添加字符串。

     

对于每个条目集合中的每个字符串,在文件中写入字符串。

我相信这会对文件进行排序。

那会有用吗?有没有更好的方法呢?

谢谢!

2 个答案:

答案 0 :(得分:0)

听起来不错。您可以使用正则表达式来提取观察结果。例如,假设观察结果由正整数组成,您可以使用:

import re
line = 'replace k = 1 if a == 1 & b == 2 & c == 3 & comments_1 == "test"'
m = re.search(r'a == (\d+) & b == (\d+) & c == (\d+)', line)
observation = tuple(map(int, m.groups()))
print(observation)

这会打印元组(1, 2, 3)

答案 1 :(得分:0)

这是一个很好的方法,但是由于你想要保留所有的行,我不会打扰使用相同三元组的行:只需列出所有行并使用它们的值三元组作为排序键进行排序。

def getvalues(line):
    """Extract a value triple from a line that matches the pattern"""
    m = re.search(r"if a == (\d+) & b == (\d+) & c == (\d+) &", line)
    if m:
        return tuple(int(v) for v in m.groups())
    else:
        return line   # Lines that don't match the pattern are sorted normally

with open("file.txt") as fp:
    lines = fp.readlines()

lines.sort(key=getvalues)

以上假设所有行都有相同的变量名,空格等。如果没有,你需要详细说明你的正则表达式。