csv模块

官网文档: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


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值