Python 打开CSV,对特定列排序并覆盖现有CSV

Python 打开CSV,对特定列排序并覆盖现有CSV,python,sorting,csv,Python,Sorting,Csv,我被这件事困扰了一段时间。我试图打开一个csv,按严重性(严重、高、中、低)排序,然后覆盖现有文件。我还想忽略第一行,或者添加一个标题行 原始CSV IP Address Severity Score 10.0.0.1 High 2302 172.65.0.1 Low 310 192.168.0.1 Critical 5402 127.0.0.1 Medium 1672` IP Address Severity Scor

我被这件事困扰了一段时间。我试图打开一个csv,按严重性(严重、高、中、低)排序,然后覆盖现有文件。我还想忽略第一行,或者添加一个标题行

原始CSV

IP Address  Severity    Score
10.0.0.1    High        2302
172.65.0.1  Low         310
192.168.0.1 Critical    5402
127.0.0.1   Medium      1672`
IP Address  Severity    Score
192.168.0.1 Critical    5402
10.0.0.1    High        2302
127.0.0.1   Medium      1672 
172.65.0.1  Low         310
修改/排序的CSV

IP Address  Severity    Score
10.0.0.1    High        2302
172.65.0.1  Low         310
192.168.0.1 Critical    5402
127.0.0.1   Medium      1672`
IP Address  Severity    Score
192.168.0.1 Critical    5402
10.0.0.1    High        2302
127.0.0.1   Medium      1672 
172.65.0.1  Low         310
代码

import csv
crit_sev = "Critical"
high_sev = "High"
med_sev = "Medium"
low_sev = "Low"
reader = csv.reader(open('sample.csv', 'r'))
row=0
my_list = []
for row in reader:
    if row[1] == crit_sev:
        my_list.append(row)
    elif row[1] == high_sev:
        my_list.append(row)
    elif row[1] == med_sev:
        my_list.append(row)
    elif row[1] == low_sev:
        my_list.append(row)

writer = csv.writer(open("sample.csv", 'w'))
header = ['IP Address', 'Severity', 'Score']
writer.writerow([header])
for word in my_list:
    writer.writerow([word])

任何帮助都将不胜感激。

这里有一个
pandas
解决方案:

import pandas as pd
# Read the CSV file
data = pd.read_csv('sample.csv')

# Configure the levels of severity
levels = pd.Series({"Critical" : 0, "High" : 1, "Medium" : 2, "Low" : 3})
levels.name='Severity'

# Add numeric severity data to the table
augmented = data.join(levels,on='Severity',rsuffix='_')

# Sort and select the original columns
sorted_df = augmented.sort_values('Severity_')[['IP Address', 'Severity','Score']]

# Overwrite the original file
sorted_df.to_csv('sample.csv',index=False)

您可以使用Python的
csv
库执行以下操作:

import socket     
import csv

severity = {"Critical" : 0, "High" : 1, "Medium" : 2, "Low" : 3}     

with open('sample.csv', 'rb') as f_input:
    csv_input = csv.reader(f_input)
    header = next(csv_input)
    data = sorted(csv_input, key=lambda x: (severity[x[1]], socket.inet_aton(x[0])))

with open('sample.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(header)
    csv_output.writerows(data)
这将保留现有标题,并根据
严重性
列对条目进行排序。接下来,它还(可选地)使用将IP地址转换为可排序的数字来按IP地址进行排序(这可能对您有用,也可能对您不有用)

例如:

IP地址、严重性、分数
10.168.0.1,临界,5402
192.168.0.1,临界,5402
10.0.0.1,高,2302
127.0.0.1,中等,1672
172.65.0.1,低,310

“或添加标题行”-您到底想说什么?为什么不在Excel或其他软件中打开CSV并在那里排序?CSV==逗号分隔的值。我在你的文件中没有看到任何逗号,所以这可能是第一个问题。是制表符分隔格式还是固定格式?修复似乎不太可能,因为当IP地址192.168.0.254出现时,您将没有足够的空间。一般的想法是读入每个记录,根据严重性对其进行分类,并将其存储在数据结构中。完成后,按严重性顺序编写新的数据结构。是否需要定义不同的级别,因为它们是文字而不是数字?@TigerhawkT3理论上是的。但在这种情况下,严重性的顺序与字母顺序(“C”<“H”<“M”<“L”)相匹配。“M”<“L”?真的吗?@TigerhawkT3哦。。。你明白我的意思了。:)不管怎样,展示如何定义级别可能会很好,因为这种匹配只是一种任意巧合。非常感谢!