2013-01-24 32 views
0

我有一個文件它看起來像下面這樣:如何使用Python從文件的一部分製作整數列表?

@ junk 
... 
@ junk 
    1.0 -100.102487081243 
    1.1 -100.102497023421 
    ... ... 
    3.0 -100.102473082342 
& 
@ junk 
... 

我感興趣的只是在@&字符之間給出數字的兩列。這些字符可能出現在文件的其他任何地方,但從不在數字塊內。

我想創建兩個列表,一個第一列,一個第二列。

List1 = [1.0, 1.1,..., 3.0] 
List2 = [-100.102487081243, -100.102497023421,..., -100.102473082342] 

我一直在使用shell腳本來準備這些文件的一個簡單的Python腳本,這使得名單,不過,我想這些過程到Python的遷移更一致的應用程序。有任何想法嗎?我對Python和文件處理方面的經驗有限。

編輯:我應該提到,這個數字塊出現在文件的兩個地方。這兩個數字塊是相同的。

編輯2:一般函數將是最令人滿意的,因爲我將它放到自定義庫中。

目前的努力

我目前使用的是shell腳本一切,但數塊修剪出成兩個單獨的列。從那裏,它是平凡的我從我的主要

import sys 
import eLIBc 
infile = sys.argv[1] 
sList = eLIBc.ReadLL(infile) 

問題稱這是使用下面的函數

def ReadLL(infile): 
    List = open(infile).read().splitlines() 
    intL = [int(i) for i in List] 
    return intL 

是知道如何從原始文件與Python提取數塊,而不是使用shell腳本。

+2

它看起來升你想讓我們爲你寫一些代碼。儘管許多用戶願意爲遇險的編碼人員編寫代碼,但他們通常只在海報已嘗試自行解決問題時才提供幫助。證明這一努力的一個好方法是包含迄今爲止編寫的代碼,示例輸入(如果有的話),期望的輸出和實際獲得的輸出(控制檯輸出,堆棧跟蹤,編譯器錯誤 - 無論是適用)。您提供的細節越多,您可能會收到的答案就越多。 –

+0

@MartijnPieters我的確在尋找一些幫助。我爲你包含了更多的代碼。 – LordStryker

+0

你在文件的其他地方有號碼嗎? – ATOzTOA

回答

1

你想循環遍歷文件本身,並設置一個標誌,當你找到第一行沒有一個@字符,之後你可以開始收集數字。當您找到&字符時,請中斷閱讀。

def readll(infile):  
    with open(infile) as data: 
     floatlist1, floatlist2 = [], [] 
     reading = False 

     for line in data: 
      if not reading: 
       if '@' not in line: 
        reading = True 
       else: 
        continue 

      if '&' in line: 
       return floatlist1, floatlist2 

      numbers = map(float, line.split()) 
      floatlist1.append(numbers[0]) 
      floatlist2.append(numbers[1]) 

所以上面:

  • 套 '讀' 到False,並且僅當不'@'線被發現,是設定爲True
  • 「閱讀」時是True
    • 如果行包含&
    • 否則它假定行包含由空格隔開兩個浮點值,這些值被添加到各自的列表返回讀取數據

通過返回,函數結束,文件自動關閉。只有第一個塊被讀取,文件的其餘部分被忽略。

+0

在「def」形式中,它是美麗的蛋糕上的櫻桃。謝謝你,先生。 – LordStryker

1

嘗試了這一點:

with open("i.txt") as fp: 
    lines = fp.readlines() 
    data = False 
    List1 = [] 
    List2 = [] 
    for line in lines: 
     if line[0] not in ['&', '@']: 
      print line 
      line = line.split() 
      List1.append(line[0]) 
      List2.append(line[1]) 
      data = True 
     elif data == True: 
      break 

print List1 
print List2 

這應該給你號的第一個塊。

輸入:

@ junk 
@ junk 
1.0 -100.102487081243 
1.1 -100.102497023421 
3.0 -100.102473082342 
& 
@ junk 
1.0 -100.102487081243 
1.1 -100.102497023421 

輸出:

['1.0', '1.1', '3.0'] 
['-100.102487081243', '-100.102497023421', '-100.102473082342'] 

更新

如果您需要兩個塊,然後使用此:

with open("i.txt") as fp: 
    lines = fp.readlines() 
    List1 = [] 
    List2 = [] 
    for line in lines: 
     if line[0] not in ['&', '@']: 
      print line 
      line = line.split() 
      List1.append(line[0]) 
      List2.append(line[1]) 

print List1 
print List2 
+0

這將從'@'行之前的任何行讀取數據。 –

+0

@MartijnPieters OP說'@'線不需要。 – ATOzTOA

+0

這不是我的意思。他需要讀取數字塊,而不是整個文件減去'@'或'&'行。有兩個數字塊(相同),其餘的文件可以忽略。目前還不清楚如何識別號碼塊。現在我的答案假設一個數字塊在第一個「@」行之後開始。 –

相關問題