根据python中单词下面的行数解析文本文件中的行“簇”

时间:2013-02-10 22:17:26

标签: python file parsing search count

所以我有一个统一格式的文本文件,我试图根据单词'cluster'下面的行数解析。到目前为止,这是我的代码:

f = open('file.txt', 'r')
main_output = open('mainoutput.txt', 'w')
minor_output = open('minoroutput.txt', 'w')
f_lines = f.readlines()
main_list = []
minor_list = []
for n, line in enumerate(open('file.txt')):
    if 'cluster' in line:
        if 'cluster' in f_lines[n+1] or f_lines[n+2] or f_lines[n+3]:
            minor_list.append(line)
            minor_list.append(f_lines[n+1])
            minor_list.append(f_lines[n+2])
            minor_list.append(f_lines[n+3])
        if 'cluster' not in f_lines[n+1] or f_lines[n+2] or f_lines[n+3]:
            main_list.append(line)
            main_list.append(f_lines[n+1])
            main_list.append(f_lines[n+2])
            main_list.append(f_lines[n+3])
minor_output.write(''.join(minor_list))
main_output.write(''.join(main_list))
f.close()
main_output.close()
minor_output.close()

文本文件的格式如下:

>Cluster 1
line 1
line 2
line 3
...

>Cluster 2
line 1
line 2
...

and so on for many clusters.

每个群集下面都有可变数量的行,从1到100+。我有兴趣按每个群集中的行数(项目)对这些群集进行排序。此代码正在运行,但两个输出文件完全相同。对我的代码或我的策略的任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

如果我了解您正确发布的代码,则需要根据群集中的项目数将数据分类为两个不同的文件。如果有三个或更少,则群集进入minoroutput.txt,而如果有更多,则进入mainoutput.txt

我怀疑存在一些重要的逻辑错误导致您的代码无法正确排序数据。

首先,检查一行是否包含单词"cluster"的测试与您的示例数据中的大写"Cluster"不匹配。这可能只是您显示的示例数据的问题,并且在检查之前通过调用行上的lower()可以很容易地修复它。

其次,检查后续行是不正确的。代码if 'cluster' in f_lines[n+1] or f_lines[n+2] or f_lines[n+3]不检查三个字符串中每个字符串中的"cluster",而只检查第一个字符串中的True。第二个和第三个字符串在布尔上下文中自行评估。如果它们不是空行,它们将是'cluster' in f_lines[n+1] or 'cluster' in f_lines[n+2] or 'cluster' in f_lines[n+3],使得整个表达式也几乎总是正确的。为了实现这一目标,您需要检查if(但我稍后会展示更好的替代方案)。另一个True语句会出现同样的问题,因为f_lines[n+2]f_lines[n+3]可能都不是空的,因此您的条件也几乎总会得到mainoutput.txt结果。

最后,您写出群集的逻辑可能不正确。它目前总是准确地写出四行,即使许多集群的项目数量多于或少于此数量。对于写入minoroutupt.txt的每个簇,将丢弃一些行(这可能是故意的)。但是,对于写入enumerate的某些群集,会出现一个明显的错误,它会在只有一个或两个项目的群集之后写出下一个群集的开头。

以下是我认为适合您的一些代码。我已经围绕循环进行了更改,以便它只读取文件一次,而不是将行读入列表一次,第二次读取cluster。我没有明确地查看接下来的三行,而是简单地将每一行放入一个列表中,每次在其中有一行with open('file.txt', 'r') as f, \ open('mainoutput.txt', 'w') as main_out, \ open('minoroutput.txt', 'w') as minor_out: cluster = [] # this variable will hold all the lines of the current cluster for line in f: if 'cluster' in line.lower(): # if we're at the start of a cluster if len(cluster) > 4: # long clusters go in the "main" file main_out.writelines(cluster) # write out the lines # main_out.writelines(cluster[:4]) else: minor_out.writelines(cluster) # or to the other file cluster = [] # reset the cluster variable to a new, empty list cluster.append(line) # always add the current line to cluster if len(cluster) > 4: # repeat the writing logic for the last cluster main_out.writelines(cluster) # main_out.writelines(cluster[:4]) else: minor_out.writelines(cluster) 时重置(使用任何大小写)。

writelines

如果您只希望将群集中的前三个项目输出到mainout.txt(其余的被丢弃),请使用两个注释的minorout.txt行代替它们之前的未注释的行。我不认为在file.txt中打印所有行是合理的替代方法。

给出>Cluster 1 line 1 line 2 line 3 >Cluster 2 line 1 line 2 line 3 line 4 >Cluster 3 line 1 >Cluster 4 line 1 line 2 line 3 line 4 line 5 这些内容:

mainoutput.txt

上面的代码将输出两个文件:

>Cluster 2 line 1 line 2 line 3 line 4 >Cluster 4 line 1 line 2 line 3 line 4 line 5

minoroutput.txt

>Cluster 1 line 1 line 2 line 3 >Cluster 3 line 1

{{1}}