1

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

这是数据集的示例(没有标题): dataset.txt

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

预期输出应如下所示: dataset1.txt

test1    abc    1
test3    hdh    1

数据集2.txt

test2    efg    2
test4    xyz    24

我想用 import sys 来实现这个,这样我就可以输入原始数据集的文件名作为一个 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 中完成一些事情。老实说,我花了相当多的时间编写上面的代码,如果有人指出我错了什么,我将不胜感激。

4

2 回答 2

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
于 2013-08-30T10:12:13.643 回答
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
于 2013-08-30T09:51:52.360 回答