首页 > 解决方案 > 提取从 CSV 排序的两列

问题描述

我有一个包含多个值的大型 csv 文件,格式为

Date,Dslam_Name,Card,Port,Ani,DownStream,UpStream,Status
2020-01-03 07:10:01,aart-m1-m1,204,57,302xxxxxxxxx,0,0,down

我想提取Dslam_NameAni值,对它们进行排序并将它们Dslam_name写入两个不同列中的新 csv。

到目前为止,我的代码如下:

import csv
import operator

with open('bad_voice_ports.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    sortedlist = sorted(readCSV, key=operator.itemgetter(1)) 
    for row in sortedlist:
        bad_port = row[1][:4],row[4][2::]
        print(bad_port)
        f = open("bad_voice_portsnew20200103SORTED.csv","a+")
        f.write(row[1][:4] + " " + row[4][2::] + '\n')
        f.close() 

但是我的值Dslam_NameAni值保存在同一列中。

作为下一步,我想计算相同值出现在第一列的次数。

标签: pythoncsv

解决方案


您正在强迫它们成为单列。将两者连接成一个字符串意味着 Python 不再将它们视为独立的。

但试试这个:

import csv
import operator

with open('bad_voice_ports.csv') as readfile, open('bad_voice_portsnew20200103SORTED.csv', 'w') as writefile:
    readCSV = csv.reader(readfile)
    writeCSV = csv.writer(writefile)
    for row in sorted(readCSV, key=operator.itemgetter(1)):
        bad_port = row[1][:4],row[4][2::]
        print(bad_port)
        writeCSV.writerow(bad_port)

如果您想包含每个键出现的次数,您也可以轻松地将其包含在程序中。我会稍微重构以将阅读和写作分开。

import csv
import operator
from collections import Counter

with open('bad_voice_ports.csv') as readfile:
    readCSV = csv.reader(readfile)
    rows = []
    counts = Counter()
    for row in readCSV:
        rows.append([row[1][:4], row[4][2::]])
        counts[row[1][:4]] += 1

with open('bad_voice_portsnew20200103SORTED.csv', 'w') as writefile:
    writeCSV = csv.writer(writefile)
    for row in sorted(rows):
        print(row)
        writeCSV.writerow([counts[row[0]]] + row)

我建议从 CSV 文件中完全删除标题行;如果您想保留第一行,则丢弃(或分离并重新添加)第一行应该是一个简单的更改。(此外,硬编码输入和输出文件名是有问题的;也许让程序从中读取它们sys.argv[1:]。)


推荐阅读