检查Python文件中一行的最后一个术语的有效方法

时间:2012-07-10 16:06:28

标签: python libsvm

我正在编写一个Python脚本,它接收一个(可能很大的)文件。以下是输入文件格式化方式的示例:

class1 1:v1 2:v2 3:v3 4:v4 5:v5
class2 1:v6 4:v7 5:v8 6:v9
class1 3:v10 4:v11 5:v12 6:v13 8:v14
class2 1:v15 2:v16 3:v17 5:v18 7:v19

其中class1和class2是某个数字,例如1和-1。 (一个好奇的用户可能会注意到这是一个与LIBSVM相关的文件,但在这种情况下不需要知道软件。)值v1,v2,...,v19表示任何整数或浮点值。显然,就总行数和每行长度而言,我的文件会比这大得多,这就是为什么我关注这里的效率。

我正在尝试检查冒号 left 的最大值。在LIBSVM中,这些被称为“特征”,并且在这里总是整数。例如,在上面概述的示例中,第1行具有5作为其最大特征。 2号线有6个最大特征,3号线有8个最大特征,最后,4号线有7个作为其最大特征。由于8是这些值中最大的值,这是我想要的值。我正在查看一个文件,其中包含行的数千个功能,以及数十万个

该文件满足以下属性:

  1. 必须严格增加功能。即允许“3:v1 4:v2”,但不允许“3:v1 3:v2。”
  2. 功能不一定是连续的,可以跳过。在我给出的第一个例子中,第一行的特征是连续顺序(1,2,3,4,5),跳过特征6,7和8.其他3行没有连续顺序的特征。没关系,只要这些功能严格增加。
  3. 现在,我的方法是检查每一行,用空格分隔每一行,用冒号分割最后一项,然后然后检查特征值。接下来,我做了一个程序来检查最大的featureNum。

    file1 = open(...)
    max = 0
    for line in file1:
        linesplit = line.rstrip('\n').split(' ')
        val = linesplit[len(linesplit) - 1]
        valsplit = val.split(':')
        featureNum = valsplit[0]
        if (featureNum > max):
            max = featureNum
     print max
     file1.close()
    

    但我希望有一种更好或更有效的方法,例如通过仅获取直接在换行符之前的那些术语来分析文件的某种方式(可能是为了避免读取所有行?)。我是Python的新手,所以如果我错过了一些明显的东西,我就不会感到惊讶。

    可能的参考:http://docs.python.org/library/stdtypes.html

1 个答案:

答案 0 :(得分:1)

由于您不关心所有行中的功能而只关心最后一行,因此您无需拆分整行。我不知道这实际上是否更快,你需要时间看看。它绝对不像Pythonic那样分裂整条线。

def last_feature(line):
    start = line.rfind(' ') + 1
    end = line.rfind(':')
    return int(line[start:end])

with open(...) as file1:
    largest = max(last_feature(line) for line in file1)