官网文档:https://docs.python.org/2/library/csv.html#module-csv
一、csv模块中的函数
1、 reader(csvfile, dialect=‘excel’, **fmtparams)
参数说明:
csvfile,必须是支持迭代(Iterator)的对象,可以是文件(file)对象或者列表(list)对象,如果是文件对象,打开时需要加"b"标志参数。
dialect,编码风格,默认为excel的风格,也就是用逗号(,)分隔,dialect方式也支持自定义,通过调用register_dialect方法来注册,下文会提到。
fmtparam,格式化参数,用来覆盖之前dialect对象指定的编码风格
import csv
with open('test.csv','rb') as myFile:
lines=csv.reader(myFile)
for line in lines: #lines对象是一个迭代器
print line
'test.csv'是文件名,‘rb’中的r表示“读”模式,因为是文件对象,所以加‘b’。open()返回了一个文件对象myFile,
reader(myFile)只传入了第一个参数,另外两个参数采用缺省值,即以excel风格读入。
reader()返回一个reader对象lines,lines是一个list,当调用它的方法lines.next()时,会返回一个string。
上面程序的效果是将csv文件中的文本按行打印,每一行的元素都是以逗号分隔符','分隔得来。
reader对象还提供一些方法:line_num、dialect、next()
2、 writer(csvfile, dialect=‘excel’, **fmtparams)
with open('t.csv','wb',newline=" ") as myFile: #一定要写newline,不写的话写入的文件会存在空白行
myWriter=csv.writer(myFile)
myWriter.writerow([7,'g'])
myWriter.writerow([8,'h'])
myList=[[1,2,3],[4,5,6]]
myWriter.writerows(myList)
'w'表示写模式。
首先open()函数打开当前路径下的名字为't.csv'的文件,如果不存在这个文件,则创建它,返回myFile文件对象。
csv.writer(myFile)返回writer对象myWriter。
writerow()方法是一行一行写入,writerows方法是一次写入多行。
注意:如果文件't.csv'事先存在,调用writer函数会先清空原文件中的文本,再执行writerow/writerows方法。
补充:除了writerow、writerows,writer对象还提供了其他一些方法:writeheader、dialect
3、 register_dialect(name, [dialect, ]**fmtparams)=====定义分隔符的函数
这个函数是用来自定义dialect的。
参数说明:
name,你所自定义的dialect的名字,比如默认的是’excel’,你可以定义成’mydialect’
[dialect, ]**fmtparams,dialect格式参数,有delimiter(分隔符,默认的就是逗号)、quotechar、quoting等等,可以参考Dialects and Formatting Parameters
~~读~~
import csv
csv.register_dialect('mydialect',delimiter='|', quoting=csv.QUOTE_ALL)#定义一个|的分隔符函数
with open('11.csv','r') as myFile:
lines=csv.reader(myFile,'mydialect')
print(lines.line_num )#0
# print(type(lines))
for line in lines:
print(line )
结果
['1,2', '3,7', '8']
['4,5', '6,5', '3']
可以看到,现在是以'|'为分隔符,1和2合成了一个字符串(因为1和2之间的分隔符是逗号,而mydialect风格的分隔
符是'|'),3单独一个字符串。
~~写~~
import csv
csv.register_dialect('mydialect',delimiter='|', quoting=csv.QUOTE_ALL)
line=(['1,2', '3,7', '8'],['4,5', '6,5', '3'])
with open('55.csv','a+',newline="") as f:
red=csv.writer(f,'mydialect')
red.writerows(line)
文件里面结果:
"1,2"|"3,7"|"8"
"4,5"|"6,5"|"3"
~~#先读后写~~
import csv
csv.register_dialect('mydialect',delimiter='|', quoting=csv.QUOTE_ALL)
with open('11.csv','r') as myFile:
lines=csv.reader(myFile,'mydialect')
print(lines.line_num )
# print(type(lines))
for line in lines:
print(line)
with open('55.csv', 'a+', newline="") as f:
red = csv.writer(f, 'mydialect')
red.writerow(line)
#写的代码
# csv.register_dialect('mydialect', delimiter='|', quoting=csv.QUOTE_ALL)
# line=(['1,2', '3,7', '8'],['4,5', '6,5', '3'])
# with open('55.csv','a+',newline="") as f:
# red=csv.writer(f,'mydialect')
# red.writerows(line)
文件里面结果:
"1,2"|"3,7"|"8"
"4,5"|"6,5"|"3"
4、unregister_dialect(name)这个函数用于注销自定义的dialect
import csv
csv.register_dialect('mydialect',delimiter='|', quoting=csv.QUOTE_ALL)
csv.unregister_dialect('mydialect')
先定义后注销就不能使用了
此外,csv模块还提供get_dialect(name)、list_dialects()、field_size_limit([new_limit])等函数,这些都比较
简单,可以自己试试。比如list_dialects()函数会列出当前csv模块里所有的dialect:
print csv.list_dialects()
输出:
['excel-tab', 'excel', 'mydialect']
'mydialect'是自定义的,'excel-tab', 'excel'都是自带的dialect,其中'excel-tab'跟'excel'差不多,
只不过它以tab为分隔符。
5、字典的方式读写
格式:
class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
# 读取字典
import csv
with open('dict.csv','r') as f:
dicts=csv.DictReader(f)
for row in dicts:
print(row['first_name'],row['last_name'])
结果:
Baked Beans
Lovely Spam
Wonderful Spam
#写入字典
with open('dict1.csv','a+',newline="") as f1:
fileHeaderNames=['first_name','last_name']#定义列名
w=csv.DictWriter(f1,fileHeaderNames)#指定列名
w.writeheader()#写入列名
dict_date=({'first_name': 'Baked', 'last_name': 'Beans'},
{'first_name': 'Lovely', 'last_name': 'Spam'}
,{'first_name': 'Wonderful', 'last_name': 'Spam'})#用列表和元祖括起来都可以
date={'first_name': 'Wonderful', 'last_name': 'Spam'}
w.writerow(date)#写入单行数据
w.writerows(dict_date)#写入多行数据
文件内容为:
first_name,last_name
Wonderful,Spam
Baked,Beans
Lovely,Spam
Wonderful,Spam