使用第一行作为 python 的变量
Using first row as variable with python
我想将这段代码更改为更加动态和具体。我想将每列中的第一行信息用作替代 'numAtts' 的 header。这样,第一行也不会包含在@data 下的数据中。
这是我的代码:
# -*- 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 = [split(strip (line)) for line in f]
###############################################################
## modify here##
numAtts = len(data[0])
logging.info(" Number of attributes : "+str(numAtts) )
print "@RELATION relationData"
print ""
for e in range(numAtts):
print "@ATTRIBUTE att{0} NUMERIC".format(e)
###############################################################
classSet = set()
for e in data:
classSet.add(e[-1])
print "@ATTRIBUTE class {%s}" % (",".join(classSet))
print ""
print "@DATA"
for item in data:
print ",".join(item[0:])
if __name__ == "__main__":
main()
输入文件是这样的(tab-separated):
F1 F2 F3 F4 F5 F6 STRING
7209 3004 15302 5203 2 1 EXAMPLEA
6417 3984 16445 5546 15 1 EXAMPLEB
8822 3973 23712 7517 18 0 EXPAMPLEC
输出文件(实际)是这样的:
@RELATION relationData
@ATTRIBUTE att0 NUMERIC
@ATTRIBUTE att1 NUMERIC
@ATTRIBUTE att2 NUMERIC
@ATTRIBUTE att3 NUMERIC
@ATTRIBUTE att4 NUMERIC
@ATTRIBUTE att5 NUMERIC
@ATTRIBUTE att6 NUMERIC
@ATTRIBUTE class {EXAMPLEB,STRING,EXPAMPLEC,EXAMPLEA}
@DATA
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 relationData
@attribute 'att[F1]' numeric
@attribute 'att[F2]' numeric
@attribute 'att[F3]' numeric
@attribute 'att[F4]' numeric
@attribute 'att[F5]' numeric
@attribute 'att[F6]' {0,1}
@attribute 'class' STRING
@data
7209,3004,15302,5203,2,1,EXAMPLEA
6417,3984,16445,5546,15,1,EXAMPLEB
8822,3973,23712,7517,18,1,EXPAMPLEC
因此,如您所见,我的代码几乎就绪,但我无法/不确定如何将第一行标记为用于 header 的变量并开始处理第 2 行的数据。
因此,我的问题是:如何格式化输出以将第一行用作 header?
有没有人有任何见识?谢谢!
您可以利用 open
在 python returns 生成器这一事实。 f.readline()
获取文件中的下一个可用行。它还会导致生成器移动到下一行,因此在列表推导中,它会跳过你已经用 f.readline()
阅读过的行。 (请参阅此处的文档:https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects)
with open(inputPath, "r") as f:
strip = str.strip
split = str.split
titles = split(strip (f.readline())
data = [split(strip (line)) for line in f]
您没有完全格式化您想要输出的标题。这里
for e in range(numAtts):
print "@ATTRIBUTE att{0} NUMERIC".format(e)
您只是将 e
的值格式化为输出。您需要在此处访问 data[0]
。
for e in range(numAtts):
print "@ATTRIBUTE att'[{0}]'' NUMERIC".format(dataa[0][e] )
稍后对于使用部分,您可以利用 range/xrange
跳过 0th
索引。
for e in range(1, numAtts):
print ",".join(data[e][0:])
此外,我建议无需在变量中存储 str
方法,您可以使用方法链接来获取所需的值。
而不是这个:
data = [split(strip (line)) for line in f]
使用这个:
data = [line.strip().split() for line in f]
*********** 已编辑以包含此选项 ************
next
还允许跳过第一行,从数据段开始,因此从第二行开始。
next(iter(data))
for item in data[1:]:
print ",".join(item[0:])
我想将这段代码更改为更加动态和具体。我想将每列中的第一行信息用作替代 'numAtts' 的 header。这样,第一行也不会包含在@data 下的数据中。
这是我的代码:
# -*- 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 = [split(strip (line)) for line in f]
###############################################################
## modify here##
numAtts = len(data[0])
logging.info(" Number of attributes : "+str(numAtts) )
print "@RELATION relationData"
print ""
for e in range(numAtts):
print "@ATTRIBUTE att{0} NUMERIC".format(e)
###############################################################
classSet = set()
for e in data:
classSet.add(e[-1])
print "@ATTRIBUTE class {%s}" % (",".join(classSet))
print ""
print "@DATA"
for item in data:
print ",".join(item[0:])
if __name__ == "__main__":
main()
输入文件是这样的(tab-separated):
F1 F2 F3 F4 F5 F6 STRING
7209 3004 15302 5203 2 1 EXAMPLEA
6417 3984 16445 5546 15 1 EXAMPLEB
8822 3973 23712 7517 18 0 EXPAMPLEC
输出文件(实际)是这样的:
@RELATION relationData
@ATTRIBUTE att0 NUMERIC
@ATTRIBUTE att1 NUMERIC
@ATTRIBUTE att2 NUMERIC
@ATTRIBUTE att3 NUMERIC
@ATTRIBUTE att4 NUMERIC
@ATTRIBUTE att5 NUMERIC
@ATTRIBUTE att6 NUMERIC
@ATTRIBUTE class {EXAMPLEB,STRING,EXPAMPLEC,EXAMPLEA}
@DATA
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 relationData
@attribute 'att[F1]' numeric
@attribute 'att[F2]' numeric
@attribute 'att[F3]' numeric
@attribute 'att[F4]' numeric
@attribute 'att[F5]' numeric
@attribute 'att[F6]' {0,1}
@attribute 'class' STRING
@data
7209,3004,15302,5203,2,1,EXAMPLEA
6417,3984,16445,5546,15,1,EXAMPLEB
8822,3973,23712,7517,18,1,EXPAMPLEC
因此,如您所见,我的代码几乎就绪,但我无法/不确定如何将第一行标记为用于 header 的变量并开始处理第 2 行的数据。
因此,我的问题是:如何格式化输出以将第一行用作 header? 有没有人有任何见识?谢谢!
您可以利用 open
在 python returns 生成器这一事实。 f.readline()
获取文件中的下一个可用行。它还会导致生成器移动到下一行,因此在列表推导中,它会跳过你已经用 f.readline()
阅读过的行。 (请参阅此处的文档:https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects)
with open(inputPath, "r") as f:
strip = str.strip
split = str.split
titles = split(strip (f.readline())
data = [split(strip (line)) for line in f]
您没有完全格式化您想要输出的标题。这里
for e in range(numAtts):
print "@ATTRIBUTE att{0} NUMERIC".format(e)
您只是将 e
的值格式化为输出。您需要在此处访问 data[0]
。
for e in range(numAtts):
print "@ATTRIBUTE att'[{0}]'' NUMERIC".format(dataa[0][e] )
稍后对于使用部分,您可以利用 range/xrange
跳过 0th
索引。
for e in range(1, numAtts):
print ",".join(data[e][0:])
此外,我建议无需在变量中存储 str
方法,您可以使用方法链接来获取所需的值。
而不是这个:
data = [split(strip (line)) for line in f]
使用这个:
data = [line.strip().split() for line in f]
*********** 已编辑以包含此选项 ************
next
还允许跳过第一行,从数据段开始,因此从第二行开始。
next(iter(data))
for item in data[1:]:
print ",".join(item[0:])