在Python中处理CSV
我这里有一个CSV文件,其中包含我们工作的一些服务器的一系列属性和值 以下是一个简短的示例:在Python中处理CSV,python,csv,jython,Python,Csv,Jython,我这里有一个CSV文件,其中包含我们工作的一些服务器的一系列属性和值 以下是一个简短的示例: Asset_ID PropSVC PropSVN PropTSC PropTSN ------------------------------------------------------------ A0001 SVC001 N032 TSC538 TS_BLAH A0002 SVC002 N38
Asset_ID PropSVC PropSVN PropTSC PropTSN
------------------------------------------------------------
A0001 SVC001 N032 TSC538 TS_BLAH
A0002 SVC002 N384 TSC002 TS_BLAH
A0006 SVC1223 N456 TSC002 TN_foo
A0006 SVC1223 N456 TSC004 T_Bar
如您所见,有些服务器(通过其资产ID进行索引)具有重复的条目,因此具有不同的属性。有些服务器可能不会在相邻行中重复,而是分布在整个文件中,但我认为这不会造成问题。
我想做的是从这里提取数据,并使用Jython 2.7创建如下文件:
Asset_ID Property Value
----------------------------------
A0001 PropSVC SVC001
A0001 PropSVN N032
A0001 PropTSC TSC538
A0001 PropTSN TS_Blah
A0002 PropSVC SVC002
A0002 PropSVN N384
A0002 PropTSC TSC002
A0002 PropTSN TS_Blah
A0006 PropSVC SVC1223
A0006 PropSVN N456
A0006 PropTSC TSC002, TSC004
A0006 PropTSN TN_foo, T_Bar
这基本上是每个服务器的属性及其值的列表,如果有多个属性且它们不相同,则为一个或多个值。这样,文件变得更小,更容易作为我们将要使用的另一个软件的输入使用
是否有任何功能或方法可以相对快速地实现这一点 首先,假设您的CSV文件名为
data.CSV
,以制表符分隔,包含:
A0001 SVC001 N032 TSC538 TS_BLAH
A0002 SVC002 N384 TSC002 TS_BLAH
A0006 SVC1223 N456 TSC002 TN_foo
A0006 SVC1223 N456 TSC004 T_Bar
识别列:
- 资产ID为
0
- PropSVC为
1
- PropSVN是
2
- PropTSC是
3
- PropTSN为
4
ID_COLUMN = 0 # Asset_ID
PROP_COLUMNS = [
('PropSVC', 1),
('PropSVN', 2),
('PropTSC', 3),
('PropTSN', 4),
]
我假设您的数据是以制表符分隔的,因此您可以使用以下命令对其进行解析:
import csv
with open('data.csv', 'rb') as fh:
reader = csv.reader(fh, delimiter='\t')
在没有任何处理的情况下,数据在解析时会如下所示:
['A0001', 'SVC001', 'N032', 'TSC538', 'TS_BLAH']
['A0002', 'SVC002', 'N384', 'TSC002', 'TS_BLAH']
['A0006', 'SVC1223', 'N456', 'TSC002', 'TN_foo']
['A0006', 'SVC1223', 'N456', 'TSC004', 'T_Bar']
现在,您要按资产ID和属性聚合属性值:
import collections
data = collections.defaultdict(set)
for row in reader:
asset_id = row[ID_COLUMN]
for prop, column in PROP_COLUMNS:
prop_value = row[column]
data[(asset_id, prop)].add(prop_value)
聚合的数据现在看起来像:
{('A0001', 'PropSVC'): set(['SVC001']),
('A0001', 'PropSVN'): set(['N032']),
('A0001', 'PropTSC'): set(['TSC538']),
('A0001', 'PropTSN'): set(['TS_BLAH']),
('A0002', 'PropSVC'): set(['SVC002']),
('A0002', 'PropSVN'): set(['N384']),
('A0002', 'PropTSC'): set(['TSC002']),
('A0002', 'PropTSN'): set(['TS_BLAH']),
('A0006', 'PropSVC'): set(['SVC1223']),
('A0006', 'PropSVN'): set(['N456']),
('A0006', 'PropTSC'): set(['TSC002', 'TSC004']),
('A0006', 'PropTSN'): set(['TN_foo', 'T_Bar'])}
现在,让我们将此数据保存到output.csv
:
with open('output.csv', 'wb') as fh:
writer = csv.writer(fh, delimiter='\t')
for (asset_id, prop), prop_values in data.iteritems():
prop_values = ", ".join(prop_values)
writer.writerow([asset_id, prop, prop_values])
这将创建以制表符分隔的文件output.csv
,其中包含:
A0001 PropSVC SVC001
A0001 PropSVN N032
A0001 PropTSC TSC538
A0001 PropTSN TS_BLAH
A0002 PropSVC SVC002
A0002 PropSVN N384
A0002 PropTSC TSC002
A0002 PropTSN TS_BLAH
A0006 PropSVC SVC1223
A0006 PropSVN N456
A0006 PropTSC TSC002, TSC004
A0006 PropTSN TN_foo, T_Bar
注意:如果您正在运行Jython 2.5,您需要将从uuu future\uuuu导入到脚本的顶部,或者将所有替换为open(…)作为fh
替换为fh=open(…)
有很多方法。你尝试过什么?你的具体问题是什么?你遇到了什么问题?