【问题标题】:CSV file field re-formattingCSV 文件字段重新格式化
【发布时间】:2018-12-08 00:11:21
【问题描述】:

我在 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 脚本需要遍历具有特定节点(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,但我还需要删除列表“Max Inbound”中的第一项。

如何首先搜索并匹配具有相同值的所有接口,然后对这些值进行数学运算。例如,在 Interface 列中,我想搜索所有 Cable0/0/0 接口(其中 4 个),然后我可以对 Inbound/Outbound max 的值进行数学计算。

这可以仅使用 CSV 模块和 re 来完成,还是我需要使用 pandas?谁能帮我弄清楚这一步?在上面的示例数据中,我只需要获取与 Cable0/0/0 匹配的值并将入站/出站相加。下一步是获取 Cable0/0/1 等的值。

【问题讨论】:

  • 你的 Python 脚本在哪里?如果没有真正看到你做了什么,我们无法弄清楚你哪里出错了。另请参阅How to Ask
  • 那里有很多子问题,但首先查看pandas dataframes 可能很有用,它非常适合处理像你这样的混合数据类型。您可以使用.rstrip 删除尾随字符,然后根据需要对您的各个值进行乘法运算。
  • 感谢您的意见。我已经用我的起始代码和输出更新了帖子。

标签: python python-2.7 csv


【解决方案1】:

由于您知道您的标题将始终包含在内,您可以简单地使用averages[1:] 分割您的列表。然而,这不是很 Pythonic。我建议使用以下代码:

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() 函数以跳过所有这些标头。

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 2015-12-07
    • 1970-01-01
    • 2016-10-04
    • 2016-01-16
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多