所以我有一个统一格式的文本文件,我试图根据单词"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+。我感兴趣的是根据每个集群中的行数(项)对这些集群进行排序。这段代码正在运行,但两个输出文件是相同的。任何关于我的代码或策略的帮助都会很棒!
如果我正确理解您发布的代码,您需要根据集群中的项目数量将数据排序为两个不同的文件。如果有三个或更少,集群进入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
语句中,在该语句中,由于f_lines[n+2]
和f_lines[n+3]
可能不都为空,因此您几乎总是会从您的条件中获得True
结果。
最后,您编写集群的逻辑可能不正确。它目前总是只写四行,尽管许多集群的项目会比这更多或更少。对于写入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)
如果您只想将集群中的前三个项目输出到mainout.txt
中(其余项目将被丢弃),请使用两个带注释的writelines
行来代替它们前面的未注释行。我认为除了打印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