因为上次帮我们产品处理过一个文件,他想生成能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可以使用。到时候我碰到了再给大家介绍。