关于python 自带csv库的使用心得 附带操作实例以及excel下乱码的解决

因为上次帮我们产品处理过一个文件,他想生成能excel处理操作的。但是上次由于时间非常紧张,所以并没有处理好。

正好无聊就来好好研究一下 ,找算法要了几个 csv文件。来好好玩一玩。

 

全篇使用了python自带的csv的库

import csv
csv.reader(csvfile[, dialect='excel'][, fmtparam])
csv.writer(csvfile, dialect='excel', **fmtparams)
以及两个我没有尝试的字典读写方法,有兴趣的可以参照官方文档。

 

要来的文件用ide打开粗略一看是这样。

这里可以比较明显的注意到,这是我编译器ji进行的换行,所以其实在生成它们的时候并没有做换行处理。这其实非常糟糕。。给格式化操作带来了难度。

所以在excel中看应该是这样

一行到底,根本毫无可读性。。 而且这里注意,我们可以发现里面的中文字符已经可以正常显示了,而使用过csv或者有过类似操作经验的同学肯定遇到过,在生成csv后用excel打开中文字符都显示为乱码,而让人不知所措。

 

这里就要提到一个叫BOM(\xef\xbb\xbf)的东西。

可以参考一下这篇文章:http://segmentfault.com/a/1190000004321605

 

加上bom之后,就能被excel正确读取和识别了。这里注意,其实使用osx下的记事本或者别的ide或者是文本编辑器打开本身都没有什么问题。。但是excel就是需要bom。。哎没办法。本人测试了许多情况,似乎加上了bom也不会对原文本造成什么奇怪的影响。

 

这里我们使用这样的代码来给一个csv文件加上bom

def add_bom():
    filename = 'issue_item_daily_stats.csv'
    with open('{filename}'.format(filename=filename), 'r+b') as file:
        file.writelines('\xef\xbb\xbf')

 

随后我们要做的就是把全部在一行的csv,格式化成我们想要的样子。 这里我直接贴一段我操作的代码 大家感受一下。

def read_format_csv():
    filename = 'issue_item_daily_stats_part1.csv'
    write_filename = 'change2.csv'
    with open('{filename}'.format(filename=filename), 'rb') as csv_file:
        csv_reader = csv.reader(csv_file)
        with open('{write_filename}'.format(write_filename=write_filename), 'wb') as write_file:
            items = []
            csv_writer = csv.writer(write_file, dialect='excel')
            csv_writer.writerow(["\xef\xbb\xbf"])
            for line in csv_reader:
                for index, i in enumerate(line):
                    if index == 0:
                        items.append(i)
                        continue
                    if index % 9 == 0:
                        csv_writer.writerow(items)
                        items = []
                        items.append(i)
                    else:
                        items.append(i)

这里的主要思路就是,从原文件中读取出需要格式化的信息,暂时保存在csv_reader里。然后重新打开一个文件,将csv_reader里获得的东西重新写入到新的文件里,下面可以看到我使用for循环对他进行遍历。

 

这里注意我在打开新文件的时候,就已经在头部写入了bom('\xef\xbb\xbf'),然后遍历csv_reader。这里csv_reader其实是每一行的一个迭代器对象。因为我们只有一行。然后遍历到的也就是第一行来得到一个数组。第一行里面数组有非常多的参数,都以',' 隔开。 所以我们再对数组进行遍历,然后按照文件的具体规则来就行格式化即可。

 

贴上一个格式化完毕的截图

 

就是这样,主要讲解一个csv文件格式化处理的思路。这里我并没有仔细介绍csv库。所以大家对这个库如果不熟悉,可以查阅一下资料和文档。 作为一个自带的轻量级操作csv的库我认为还是比较方便和好用的。处理更大型的csv文件我们还有pandas可以使用。到时候我碰到了再给大家介绍。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值