在Python中处理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

我这里有一个CSV文件,其中包含我们工作的一些服务器的一系列属性和值

以下是一个简短的示例:

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(…)

有很多方法。你尝试过什么?你的具体问题是什么?你遇到了什么问题?