在Python中处理CSV

2024-04-25 22:25:00 发布

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

我这里有一个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

它基本上是每个服务器的属性和它们的值的列表,如果有多个并且它们不相同的话。这样,文件变得更小,更容易作为我们将要使用的另一个软件的输入。你知道吗

有没有什么功能或方法可以相对快速地实现这一点?你知道吗


Tags: 文件服务器id属性tsa0001a0002n456
1条回答
网友
1楼 · 发布于 2024-04-25 22:25:00

首先,假设您的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。你知道吗
  • PropSVC1。你知道吗
  • PropSVN2。你知道吗
  • PropTSC3。你知道吗
  • PropTSN4。你知道吗

记录如下:

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)

聚合的data现在看起来像:

{('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

注意:如果您运行的是Jython2.5,则需要将from __future__ import with_statement添加到脚本顶部,或者将所有with open(...) as fh替换为fh = open(...)。你知道吗

相关问题 更多 >

    热门问题