python读写csv的操作汇总

记录我在项目中遇到的,会持续更新,:)

我没有特定用一个库去完成我要读、写、遍历csv的需求,因为常常由于编码的玄学,发现一种方法不适应时于是马上转而用另一种方式,然后就实现了。

显然这样的弊端是我对于编码问题还是一知半解,这里立一个有空要搞清楚编码问题的flag!

下面是应对一些情景时,我的成功的做法。

打开csv来读

1.用csv库

csv如下:


代码如下

csv文档的标题行(首行)需要特殊处理,csv.DictReader可以很好的解决这个问题。DictReader将读取的行转换为python字典对象,而不是列表。标题行的各列名即为字典的键名。

               with open("./static/Dataset/" + foldername + "/email.csv", encoding='utf-8', errors='ignore') as csvfile:
                fieldnames = ("time", "proto", "sip", "sport", "dip", "dport", "from", "to", "subject")
                reader = csv.DictReader(csvfile, fieldnames)
                re_email = re.compile('\w+@[hightech.]{9}[com,net,cn]{1,3}')
                for row in reader:
                    if (re_email.match(row["from"])): #遍历每一行时要读某一列的数据用row['列名']的形式


2.用pandas库

csv如下:

    

代码如下:

import pandas as pd

        df=pd.read_csv(targetfolder+filename+'.csv')
        latN=df['纬度'].drop_duplicates().__len__()
        lats=list(df['纬度'].drop_duplicates())
        lonN=df['经度'].drop_duplicates().__len__()
        lons=list(df['经度'].drop_duplicates())

2.把数据写入csv(新的csv)

1.用pandas库

代码如下:大意是把要写入csv的数据先装在一个个的list里(前9行代码),然后,用DataFrame格式封装,再用to_csv函数写入。

    time_list = []
    proto_list = []
    sip_list = []
    sport_list = []
    dip_list = []
    dport_list = []
    from_list = []
    to_list = []
    subject_list = []
    with open("../static/Dataset/"+foldername+"/email.csv",encoding='gb18030', errors='ignore') as file:
        fieldnames = ("time", "proto", "sip", "sport", "dip", "dport", "from", "to", "subject")
        reader=csv.DictReader(file,fieldnames)
        re_email = re.compile('\w+@[hightech.]{9}[com,net,cn]{1,3}')
        for row in reader:
                if (re_email.match(row["from"])):
                    flag = 0
                    for each in row["to"].split(";"):
                        if (re_email.match(each) == False):
                            flag = 1
                            break
                    if (flag == 0):
                        subject_list.append(chinese_text_cut(row["subject"]))
                        time_list.append(row["time"])
                        proto_list.append(row["proto"])
                        sip_list.append(row["sip"])
                        sport_list.append(row["sport"])
                        dip_list.append(row["dip"])
                        dport_list.append(row["dport"])
                        from_list.append(row["from"])
                        to_list.append(row["to"])
    df2 = pd.DataFrame({
        'time': pd.Series(time_list),
        'proto': pd.Series(proto_list),
        'sip': pd.Series(sip_list),
        'sport': pd.Series(sport_list),
        'dip': pd.Series(dip_list),
        'dport': pd.Series(dport_list),
        'from': pd.Series(from_list),
        'to': pd.Series(to_list),
        'subject': pd.Series(subject_list)
    })
    df2.to_csv("F:\interactiveVisual\mysite\static\Dataset\\" + foldername + "\email_inner.csv",       #新的csv存放的位置
               index=True,                                                                             #新的csv要不要序列号(我选择要)
               columns=['time', 'proto', 'sip', 'sport', 'dip', 'dport', 'from', 'to', 'subject'],     #设置csv各列的顺序是按照我规定来存
               encoding='utf-8')

新生成的csv如下:






评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值