0

你好,我有一个 txt 文件,它由 N 行和 96 个值组成,我预计它是 N*96 组织的,但实际上行数不是两倍,第一行是 50 秒 46 等等

我写了一个代码来重新组合原始行,其他 2 行读取一行,但我问是否有一种方法可以连续读取每个字段。每个值都用空格字符分隔。

for j in range (239) :
    L=[]
    lc1 = f.readline().split()
    lc2 = f.readline().split()

    for i in range(50) :
        L.append(lc1[i])

    for i in range(46) :
        L.append(lc2[i])

    table[j][:]=L   

f.close()  

问候

4

3 回答 3

0

嗯...关于分割线部分,阅读代码比阅读您的描述更有意义。:)

鉴于您的文本的输入结构是已知的。即,每行 96 个单词,您可以改为执行以下操作:

ValuesPerLine=96
ResultsTable=[]
TableIndex=0
NewLine=[]

for line in f:
    for value in line.split():
        NewLine.append(value)
        if len(NewLine) == ValuesPerLine:
             ResultsTable[TableIndex][:]=NewLine
             NewLine=[]
             TableIndex=TableIndex+1

以这种方式,即使这些行后来以不同的方式拆分,只要期望结果中每行有 96 个值,这将从您的源中生成。

“for line in f:”的好处是它可以像“readlines()”与“readline()”一样有效地处理它,因此您可以获得一些性能改进。

编辑:

根据您打开的文件类型,从文件读取的行中删除任何“\n”可能会有所帮助,以避免在集合中出现一个值,不时地嵌入一个“\n”。

于 2013-04-05T16:00:11.450 回答
0

我不确定我是否理解您的问题,但这是一种将您的两个循环收集到一个语句中的方法:

for j in range (239) :
    lc1 = f.readline().split()
    lc2 = f.readline().split()

    L = lc1[:50] + lc2[:46]

    table[j][:]=L   

f.close()  

我不禁尝试回收@jon-clements 在Copy the last three lines of a text file in python? 中提出的好技巧?

q = collections.deque(2) # define max size of deque 
table = []
with open("test.txt") as f:
    for line in f :
        q.append(line)
        if len(q) != 2 or len(q[0]) != 50 :
            continue
        table.append(q[0] + q[1])

适用于 python 2.7 或更高版本

于 2013-04-05T16:03:04.437 回答
0

假设文件可以轻松加载到内存中,我会执行以下操作:

all_fields = f.read().split():
for i in range(0, len(all_fields), 96):
    fields = all_fields[i:i+96]
    # process fields 
于 2013-04-05T18:47:24.980 回答