在python中自动将最终列和倒数第二列标识为变量

2024-04-23 10:31:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试自动化我引入的HERE下面代码的一部分。因为它是,代码工作,并达到我所期望的最终结果。但是,其中一个变量是半自动的,我想将其自动化。你知道吗

这是我必须将原始数据传输到输入文件的代码。你知道吗

# -*- coding: UTF-8 -*-

import logging
from optparse import OptionParser
import sys

def main():
    LEVELS = {'debug': logging.DEBUG,
              'info': logging.INFO,
              'warning': logging.WARNING,
              'error': logging.ERROR,
              'critical': logging.CRITICAL}

    usage = "usage: arff automate [options]\n ."
    parser = OptionParser(usage=usage, version="%prog 1.0")

    #Defining options   
    parser.add_option("-l", "--log", dest="level_name", default="info", help="choose the logging level: debug, info, warning, error, critical")    

    #Parsing arguments
    (options, args) = parser.parse_args()

    #Mandatory arguments    
    if len(args) != 1:
        parser.error("incorrect number of arguments")

    inputPath = args[0]


    # Start program ------------------

    with open(inputPath, "r") as f:
        strip = str.strip
        split = str.split
        data = [line.strip().split() for line in f]


###############################################################
## Below Here is the part that I need to modify
###############################################################


    numAtts = len(data[0])
    logging.info(" Number of attributes : "+str(numAtts) )

    print "@relation 'o_wekaarff.arff'"

    for e in range(numAtts):
        if e < 5:
            print "@ATTRIBUTE 'att [{0}]' numeric".format(data[0][e])
        elif e == 5:
            print "@ATTRIBUTE 'att [{0}]' binary".format(data[0][e])
        elif e == 6:
            print "@ATTRIBUTE 'att [{0}]' string".format(data[0][e])

###############################################################
## Above Here is the part that I need to modify
###############################################################

    classSet = set()
    for e in data:
        classSet.add(e[-1])
    print ""

    print "@data"

    next(iter(data))
    for item in data[1:]:
        print ",".join(item[0:])



if __name__ == "__main__":
    main()

这是我使用的原始数据:

F1  F2  F3  F4  F5  {0,1}   STRING
7209    3004    15302   5203    2   1   EXAMPLEA
6417    3984    16445   5546    15  1   EXAMPLEB
8822    3973    23712   7517    18  0   EXPAMPLEC

结果如下:

@relation 'o_wekaarff.arff'
@ATTRIBUTE 'att [F1]' numeric
@ATTRIBUTE 'att [F2]' numeric
@ATTRIBUTE 'att [F3]' numeric
@ATTRIBUTE 'att [F4]' numeric
@ATTRIBUTE 'att [F5]' numeric
@ATTRIBUTE 'att [{0,1}]' binary
@ATTRIBUTE 'att [STRING]' string

@data
7209,3004,15302,5203,2,1,EXAMPLEA
6417,3984,16445,5546,15,1,EXAMPLEB
8822,3973,23712,7517,18,0,EXPAMPLEC

但是,这是示例数据。在将来,我可能会有成千上万的专栏。因此,我希望脚本能够自动识别出什么是最后一列和倒数第二列,这样就不会像当前使用e时那样手动定义它们所在的数字。你知道吗

有没有一种pythonic方法可以做到这一点,而不必像输出示例中所示,手动定义稍后使用特定变量打印的列数?你知道吗


Tags: 代码inimportinfoparserfordatamain
2条回答

可以将以下方法添加到示例代码中。它首先将第一行读入一个列表(可以是任何长度)。它将数字格式指定给除最后两个条目以外的所有条目。然后将二进制和字符串分配给剩余的两个条目。您可能拥有的初始列数没有限制(在合理范围内)。你知道吗

然后它将剩下的行处理成您给定的格式。你知道吗

import csv

with open(inputPath, "r") as f_input:
    csv_input = csv.reader(f_input, delimiter=" ", skipinitialspace=True)
    first_row = csv_input.next()

    print "@relation 'o_wekaarff.arff'" 

    for col in first_row[:-2]:
        print "@ATTRIBUTE 'att [{0}]' numeric".format(col)

    for col, attribute in zip(first_row[-2:], ["binary", "string"]):
        print "@ATTRIBUTE 'att [{0}]' {1}".format(col, attribute)

    print "\n@data"

    for row in csv_input:
        print ",".join(row)

根据原始输入,输出如下:

@relation 'o_wekaarff.arff'
@ATTRIBUTE 'att [F1]' numeric
@ATTRIBUTE 'att [F2]' numeric
@ATTRIBUTE 'att [F3]' numeric
@ATTRIBUTE 'att [F4]' numeric
@ATTRIBUTE 'att [F5]' numeric
@ATTRIBUTE 'att [{0,1}]' binary
@ATTRIBUTE 'att [STRING]' string

@data
7209,3004,15302,5203,2,1,EXAMPLEA
6417,3984,16445,5546,15,1,EXAMPLEB
8822,3973,23712,7517,18,0,EXPAMPLEC
data[0][-2:]

这将为您提供列表的最后两个元素(如果存在的话)。你知道吗

相关问题 更多 >