根据特定列值将数据集拆分为两组行[python,unix]

时间:2013-08-30 09:46:27

标签: python unix split row sys

我有一个数据集,行和列保存为制表符分隔的文本格式。我想根据列[x]是否具有特定值将此数据集划分为两个较小的数据集。

以下是数据集的示例(没有标题):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实现这个,这样我就可以输入原始数据集的文件名作为unix命令,并指定我想要的输出选项。在这种情况下,我将定义一个名为“unique”的选项来输出dataset1.txt,并选择一个选项“multi”来输出dataset2.txt。命令行应如下所示:

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

e.g。

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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