题外话:终于有点时间写博客了。还是比较开心的。工作中大部分时间基本上不编程,除了shell和敲下命令外。下班后才有空看看python。最近整理一些数据,同事给了我10万行数据,让我安装他的格式给筛选出来,我选择使用csv模块将处理后的数据进行导出。碰到个问题。
某一列的前置零没有了,开始以为是python程序出问题,一看csv有,但是exel打开看没有,问题原因是exel将前置零给忽略了。还好,一下子解决了。
以下的大部分文字来自python2.7手册。
(有道翻译的,所以翻译难免出错,知道大概意思就好。)
先给我我的数据:是以逗号分隔的。不是空格。
“`
in_hour_time,counts
20170830 11,1667
20170830 12,2622
20170830 13,2578
20170830 14,2878
“`
1)csv
所谓的CSV(逗号分隔值)格式是电子表格和数据库最常见的导入和导出格式。没有“CSV标准”,所以这种格式是由许多读和写的应用程序定义的。缺乏标准意味着在不同应用程序所产生和使用的数据中经常存在细微的差异。这些差异使得从多个数据源处理CSV文件变得很麻烦。尽管如此,虽然分隔符和引用字符各不相同,但总体格式非常相似,可以编写单个模块,可以有效地操作这些数据,隐藏读取和写入程序员数据的细节。
csv模块实现了以csv格式读取和写入表格数据的类。它允许程序员说:“以Excel编写的格式写入数据,”或者“从Excel生成的文件中读取数据”,而不知道Excel使用的CSV格式的具体细节。程序员还可以描述其他应用程序理解的CSV格式,或者定义自己的专用CSV格式。
2)打开文件的模式:csv.reader
手册上的一个例子:
>>> import csv
>>> with open('eggs.csv', 'rb') as csvfile:
... spamreader = csv.reader(csvfile,
delimiter=' ',quotechar='|')
... for row in spamreader:
... print ', '.join(row)
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam
题外话:这里用到了with open来读取文件,所以不需要手动关闭文件了。
csv.reader(csvfile, dialect=’excel’, **fmtparams)
这里只管示例中的参数:
参数 | 含义 |
---|---|
csvfile | 一个可以迭代的对象 |
delimiter | 分隔符 |
quotechar | 字段加什么类型的字符,如果指定加”引号,那么:”Shenzhen,China” |
如下:一个实例:
import csv
with open('h_r.csv','rb') as cf:
spamreader = csv.reader(cf,delimiter = ',',
quotechar = '"')
for row in spamreader:
print row
输出如下:
['in_hour_time', 'counts']
['20170830 11', '1667']
['20170830 12', '2622']
['20170830 13', '2578']
['20170830 14', '2878']
++++++++++++++++++++++++++++
而元数据如下:
in_hour_time,counts
20170830 11,1667
20170830 12,2622
"20170830 13",2578 #这里带了引号的,而输出是不带引号的。
20170830 14,2878
3)csv.writer
import csv
with open('eggs.csv', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(['Spam'] * 4 + ['Bak
ed Beans'])
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
程序在当前目录下新建了一个eggs.csv文件,
输出如下:
Spam Spam Spam Spam |Baked Beans|
Spam |Lovely Spam| |Wonderful Spam|
quoting=csv.QUOTE_MINIMAL
quoting的意思是指定对插入到csv文件中的一行记录所有数据加指定的字符的方式:上面是符号“|”
csv.QUOTE_MINIMAL表示只对包含在csv中需要转义的特殊字符的字段加引号
可以使用新输出的文件,试验下第一种csv.reader
with open('eggs.csv','rb') as cf:
spamreader = csv.reader(cf,delimiter = ' ',
quotechar = '|')
for row in spamreader:
print row
该例子中,分隔符是空格。
输出如下:
['Spam', 'Spam', 'Spam', 'Spam', 'Baked Beans']
['Spam', 'Lovely Spam', 'Wonderful Spam']
可以看出来,没有 “|”符号了吧。
4)字典写入:
import csv
with open('names.csv', 'w') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
输出如下:
first_name,last_name
Baked,Beans
Lovely,Spam
Wonderful,Spam
还有很方法,属性,下次用到再说。