CSV文件字段重新格式化

时间:2018-06-28 20:36:55

标签: python python-2.7 csv

我在CSV文件中包含以下数据。它有8列。数据如下:

Device,Interface,Description,Average Inbound,Max Inbound,Average Outbound,Max Outbound
Router,Cable0/0/0,,34.13M bps,88.57M bps,26.12M bps,80.39M bps
Router,Cable0/0/0-upstream0,Node1,10.60M bps,16.07M bps,0 bps,0 bps
Router,Cable0/0/0-upstream1,Node1,4.74M bps,13.71M bps,0 bps,0 bps
Router,Cable0/0/0-upstream2,Node1,2.14M bps,10.65M bps,0 bps,0 bps
Router,Cable0/0/0-upstream3,Node1,1.35M bps,8.33M bps,0 bps,0 bps
Router,Cable0/0/1-upstream0,Node2,6.67M bps,7.80M bps,0 bps,0 bps
Router,Cable0/0/1-upstream1,Node2,6.40M bps,8.22M bps,0 bps,0 bps
Router,Cable0/0/1-upstream2,Node2,5.21M bps,8.06M bps,0 bps,0 bps
Router,Cable0/0/1-upstream3,Node2,4.84M bps,7.80M bps,0 bps,0 bps

我不需要对Device列或Max InboundMax Outbound列进行任何操作。但是,我需要能够对每个节点(“描述”列)的Avg. InboundAvg. Outbound求和。

例如,我的Python脚本需要遍历具有特定Node(Node1,Node2等)的每一行,然后对这些入站和出站平均值求和。问题是CSV文件包含垃圾字符,例如值的末尾附加“ M”(百万)和“ bps”(每秒)。我需要删除这些字符并将其转换为整数,然后才能对其进行数学运算。说到数学,我还需要将这些值转换为每秒的兆位。最好的方法的任何想法将不胜感激。

感谢您的信息。我开始使用的代码是:

import csv
import string
nodes = []
averages = []

with open('csvfile') as csvDataFile:
csvReader = csv.reader(csvDataFile)
for row in csvReader:
    averages.append(row[4])

print averages

它将给出以下结果:

['Max Inbound', '88.57M bps', '16.07M bps', '13.71M bps', '10.65M bps', 
'8.33M bps', '7.80M bps', '8.22M bps', '8.06M bps', '7.80M bps']

我可以像前面提到的那样使用rstrip来处理诸如M和bps之类的结尾字符,但我还需要摆脱列表“最大入站”中的第一项。

如何首先在所有具有相同值的接口上进行搜索和匹配,然后对这些值进行数学运算。例如,在“接口”列中,我要搜索所有Cable0 / 0/0接口(其中4个),然后可以对最大入站/出站值进行数学运算。

可以仅使用CSV模块并重新执行此操作吗?还是我需要使用熊猫?谁能帮我找出这一步?在上面的示例数据中,我只需要获取与Cable0 / 0/0相匹配的值,然后将入站/出站加起来即可。下一步将是获取Cable0 / 0/1等的值。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

由于您知道将始终包含标头,因此您可以简单地使用averages[1:]分割列表。但是,这不是Python风格。我建议使用以下代码:

with open('csvfile') as csvDataFile:
    csvReader = csv.reader(csvDataFile)
    next(csvReader) # Skips the header row!
    # Write the rest of your code here

next()函数是Python的内置功能,可以很好地应用于csv.reader对象。如果您有多个标题,则可以连续多次应用next()函数以跳过所有这些标题。