2013-08-30 42 views
1

我有一個數據集,其行和列保存爲製表符分隔的文本格式。我想根據column [x]是否有一定的值將這個數據集分成兩個較小的數據集。根據特定的列值將數據集分成兩組行[python,unix]

這裏是數據集的示例(沒有報頭):dataset.txt

test1 abc 1 
test2 efg 2 
test3 hdh 1 
test4 xyz 24 

預期的產出應該是這樣的:dataset1.txt

test1 abc 1 
test3 hdh 1 

dataset2.txt

test2 efg 2 
test4 xyz 24 

我想用import sys來實現這一點,以便我可以輸入原始文件名l數據集作爲unix命令並指定我想要的輸出選項。在這種情況下,我將定義一個名爲「unique」的選項來輸出dataset1.txt,並定義一個選項「multi」來輸出dataset2.txt。命令行應該如下所示:

python code.py [option] [filename] > [output] 

例如,

python code.py unique dataset.txt > dataset1.txt 
python code.py multi dataset.txt > dataset2.txt 

這裏是我寫的代碼:

import sys 

option = sys.argv[1] 
filename = sys.argv[2] 
options = ['unique','multi'] 

def out_unique(data): 
    for row in data: 
     if column[2] == 1: 
      print row 

def out_multi(data): 
    for row in data: 
     if column[2] != 1: 
      print row 

if option == 'unique': 
    out_unique(filename) 
elif option == 'multi': 
    out_multi(filename) 
else: 
    print 'available options:', options 

這裏是我的錯誤:

Traceback (most recent call last): 
    File "out_if_col.py", line 23, in <module> 
    out_unique(filename) 
    File "out_if_col.py", line 13, in out_unique 
    if column[3] == 1: 
NameError: global name 'column' is not defined 

我知道這可能看起來很可笑的專家那裏,但這是我第一次嘗試在python中完成某些事情。說實話,我花了相當多的時間來編寫上面的代碼,並且如果有人指出我錯了什麼,我會很感激。

回答

2

你的腳本更正:

import sys 

option = sys.argv[1] 
filename = sys.argv[2] 
options = ['unique','multi'] 

def out_unique(data): 
    for row in data.readlines(): 
     column = row.strip().split() 
     if column[2] == 1: 
      print row 

def out_multi(data): 
    for row in data.readlines(): 
     column = row.strip().split() 
     if column[2] != 1: 
      print row 

if option == 'unique': 
    out_unique(open(filename, 'r')) 
elif option == 'multi': 
    out_multi(open(filename, 'r')) 
else: 
    print 'available options:', options 

的相同但具有全面的名單(恕我直言,看起來更pythonic):

import sys 

option = sys.argv[1] 
filename = sys.argv[2] 
options = ['unique','multi'] 

def out_unique(data): 
    print '\n'.join(row for row in data.readlines() if row.strip().split()[2] == '1') 

def out_multi(data): 
    print '\n'.join(row for row in data.readlines() if row.strip().split()[2] != '1') 

if option == 'unique': 
    out_unique(open(filename, 'r')) 
elif option == 'multi': 
    out_multi(open(filename, 'r')) 
else: 
    print 'available options:', options 
+0

非常感謝!它現在正在工作!你知道我如何擺脫出現在每個輸出行之間的空行嗎?值得爲此做一個新線程嗎? – biohazard

+0

噢,我無法弄清楚第一個代碼,但是我可以通過在第二個代碼中用''替換'\ n'來輕鬆擺脫空行。謝謝 :) – biohazard

1

您需要定義column作爲值的當前行中的列表,如:

def out_unique(data): 
    for row in data: 
     column = row.strip().split() 
     if column[2] == 1: 
      print row 

def out_multi(data): 
    for row in data: 
     column = row.strip().split() 
     if column[2] != 1: 
      print row 
+1

'column [2] =='1''。 –

+0

謝謝!現在我得到了「IndexError:list out of range」,但希望查看row.strip().split()函數將使我走上正確的軌道。 – biohazard

相關問題