0

所以我有一个统一格式的文本文件,我试图根据“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+。我有兴趣按每个集群中的行数(项目)对这些集群进行排序。此代码有效,但两个输出文件相同。对我的代码或策略的任何帮助都会很棒!

4

1 回答 1

1

如果我理解您正确发布的代码,您希望根据集群中的项目数将数据分类到两个不同的文件中。如果有 3 个或更少,则集群进入minoroutput.txt,如果超过 3 个,则进入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
于 2013-02-10T23:12:25.087 回答