0

我正在尝试使用 python 来解析一个文本文件(存储在 var trackList 中),其中包含时间和标题,看起来像这样

00:04:45 example text
00:08:53 more example text
12:59:59 the last bit of example text

我的正则表达式 (rem) 有效,我还能够正确地将字符串 (i) 拆分为两部分(如我将时间和文本分开),但我无法添加拆分返回的数组(使用 .extend)到我之前创建的一个大数组(sLines)。

f=open(trackList)
count=0
sLines=[[0 for x in range(0)] for y in range(34)]   
line=[]

for i in f:
    count+=1
    line.append(i)
    rem=re.match("\A\d\d\:\d\d\:\d\d\W",line[count-1])
    if rem:
        sLines[count-1].extend(line[count-1].split(' ',1))
    else:
        print("error on line: "+count)

该代码应该遍历文件 trackList 中的每一行,测试该行是否符合预期,如果是,则将时间与文本分开,并将结果作为数组保存在数组中,索引小于 1当前行号,如果没有打印错误,将我指向该行

我使用array[count-1]的 python 数组是零索引的,而文件行不是。

.extend()希望在父 for 循环的同一迭代中将较小数组的两个元素都添加到较大数组中。

4

1 回答 1

1

所以,你有一些相当混乱的代码。

例如做:

[0 for x in range(0)]

是一种非常奇特的初始化空列表的方式:

>>> [] == [0 for x in range(0)]
True

另外,你怎么知道得到一个 34 行长的矩阵?您还对在 for 循环中调用行“i”感到困惑,通常这将保留为索引的简写语法,您希望它是一个数值。当您已经拥有行变量 (i) 时,将 i 附加到 line 然后将其重新引用为 line[count-1] 是多余的。

您的整体代码可以简化为如下所示:

# load the file and extract the lines
f = open(trackList)
lines = f.readlines()
f.close()

# create the expression (more optimized for loops)
expr   = re.compile('^(\d\d:\d\d:\d\d)\s*(.*)$')
sLines = []

# loop the lines collecting both the index (i) and the line (line)
for i, line in enumerate(lines):
    result = expr.match(line)

    # validate the line
    if ( not result ):
        print("error on line: " + str(i+1))
        # add an invalid list to the matrix
        sLines.append([])  # or whatever you want as your invalid line
        continue

    # add the list to the matrix
    sLines.append(result.groups())
于 2012-09-05T18:00:06.170 回答