Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析;“集群”;在python中,基于单词下面的行数的文本文件中的行数_Python_File_Parsing_Search_Count - Fatal编程技术网

解析;“集群”;在python中,基于单词下面的行数的文本文件中的行数

解析;“集群”;在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

因此,我有一个统一格式的文本文件,我试图根据单词“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
,如果有更多,集群进入
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
块。启动可能也有点愚蠢,因为它在第一个集群启动时对次要文件进行零行写入。也许可以用不同的方式来设计,但这似乎是最简单的代码。