2013-04-05 117 views
0

你好我有一個由N行96個值組成的文本文件 我預計它是有組織的N * 96但不是 實際上行數是雙數第一行是50秒46等等閱讀txt文件字段後

我寫了一個代碼,重新編寫原始行與其他2行讀取行 ,但我問是否有一種方法,而不是連續讀取每個字段。 每個值用空格caractere分隔。

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() 

問候

+0

看看標準庫中可愛的'csv'模塊。 2.7:http://docs.python.org/2/library/csv.html 3.3:http://docs.python.org/3.3/library/csv.html – bernie 2013-04-05 15:41:15

回答

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」。

0

我不知道如果我理解你的問題,但這裏是收集你的兩個環插入一個語句的方式:

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

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

    table[j][:]=L 

f.close() 

我不禁想通過回收@喬恩提出的好的技巧在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]) 

作品-clements與Python 2.7或更高

0

假設該文件可以很容易地加載到內存中,我會做這樣的事情:

all_fields = f.read().split(): 
for i in range(0, len(all_fields), 96): 
    fields = all_fields[i:i+96] 
    # process fields