我正在尝试自动化我引入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
方法可以执行此操作,而无需手动定义稍后使用特定变量打印的列数,如输出示例中所示?
答案 0 :(得分:1)
data[0][-2:]
这将为您提供列表的最后两个元素(如果存在)。
答案 1 :(得分:1)
可以在示例代码中添加以下方法。它首先将第一行读入列表(可以是任意长度)。它将数字格式分配给除最后两个条目之外的所有条目。然后它将二进制和字符串分配给剩余的两个条目。您可能拥有的初始列数没有限制(在合理范围内)。
然后将剩余的行处理为您提供的格式。
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