解析;“集群”;在python中,基于单词下面的行数的文本文件中的行数
因此,我有一个统一格式的文本文件,我试图根据单词“cluster”下面的行数来解析它。以下是我目前的代码:解析;“集群”;在python中,基于单词下面的行数的文本文件中的行数,python,file,parsing,search,count,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
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
,如果有更多,集群进入mainpoutput.txt
我怀疑有几个重要的逻辑错误导致代码无法正确排序数据
首先,测试一行是否包含单词“cluster”
与示例数据中大写的“cluster”
不匹配。这可能只是您所展示的示例数据的问题,在检查它之前,通过在线调用lower()
很容易解决
其次,您对后面几行的检查不正确。如果f_线[n+1]或f_线[n+2]或f_线[n+3]中的“集群”,则代码不会检查三个字符串中的每一个,而只检查第一个字符串中的“集群”
。第二个和第三个字符串都是在布尔上下文中自行计算的。如果它们不是空行,它们将是True
,这使得整个表达式几乎总是True。要使其正常工作,您需要检查f_行[n+1]中的“cluster”或f_行[n+2]中的“cluster”或f_行[n+3]中的“cluster”
(但稍后我会给出一个更好的选择)。另一个if
语句也会出现同样的问题,因为f_行[n+2]
和f_行[n+3]
可能都不是空的,因此您的条件几乎总是会得到True
结果
最后,您编写集群的逻辑可能不正确。它当前总是准确地写出四行,即使许多集群的项目比这多或少。对于写入mainpoutput.txt
的每个集群,一些行将被丢弃(这可能是故意的)。但是,对于一些写入minoroutupt.txt
的集群,会有一个明显的错误,它会在只有一个或两个项目的集群之后写出下一个集群的开始
这里有一些我认为对你有用的代码。我改变了循环,使它只读取文件一次,而不是将行一次读取到列表中,然后在enumerate
中再次读取。我没有明确地查看接下来的三行,而是将每一行放入一个列表中,每次有一行包含cluster
(有任何大小写)时都进行重置
如果您只想将集群中的前三个项目输出到mainout.txt
(其余项目将被丢弃),请使用两个注释的writeline
行代替它们前面的未注释行。我认为除了在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
上述代码将输出两个文件:
mainpoutput.txt
:
>Cluster 2
line 1
line 2
line 3
line 4
>Cluster 4
line 1
line 2
line 3
line 4
line 5
>Cluster 1
line 1
line 2
line 3
>Cluster 3
line 1
minoroutput.txt
:
>Cluster 2
line 1
line 2
line 3
line 4
>Cluster 4
line 1
line 2
line 3
line 4
line 5
>Cluster 1
line 1
line 2
line 3
>Cluster 3
line 1
您希望输出的格式如何?最好是相同的格式谢谢!这非常有帮助。我对python非常陌生,我现在只编写了大约2周的代码,因此我的原始代码出现了错误,我理解您的代码在做什么,但我很难确定当它遇到另一个“集群”实例时,列表的哪个部分会被“重置”?如果您能解释一下,那将非常有帮助。我提到的“重置”是在
If
/else
块之后创建一个新列表,名为集群
。我将在代码中添加一些注释。非常感谢您的帮助!如果我理解正确的话;正在将一个群集添加到列表=>该列表写入正确的输出文件=>重置列表=>列出下一个群集,然后将其添加到输出文件=>再次重置列表=>并重复此操作。。。直到file.txt文件用完?是的,完全正确。需要对输入文件中的最后一个列表进行特殊处理(因为下一个集群的开始会检测到其他集群的结束),您可以将其视为结尾处的重复if
/else
块。启动可能也有点愚蠢,因为它在第一个集群启动时对次要文件进行零行写入。也许可以用不同的方式来设计,但这似乎是最简单的代码。