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