Python CSV模块使用实例

来源:本网整理

'w'为擦写,即清除已有数据后写入新的。用'a+'为追加。这样就行www.zgxue.com防采集请勿采集本网。

举几个例子来介绍一下,Python 的 CSV模块的使用方法,包括,reader, writer, DictReader, DictWriter.register_dialect

标准库就自带csv模块 import csv spamReader=csv.reader(open('eggs.csv','rb'),delimiter=' ',quotechar='|') for row in spamReader: print ','.join(row) Spam,Spam,Spam,Spam,Spam,Baked

一直非常喜欢python的csv模块,简单易用,经常在项目中使用,现在举几个例子说明一下。

2.使用第三方库中的csv文件读写函数(本质上还是使用python的文件读写方法),如科学计算包pandas包中就有read_csv()to_csv()等函数,其他的一些第三方包里也有,可以自行查询。两种方法各有优劣,第一种

复制代码 代码如下:

with open('test.csv')as csvfile:rows=csv.reader(csvfile)with open('test1.csv','w',newline='')as f:writer=csv.writer(f)for row in rows:row.append(row[len(row)-1])writer.writerow(row)

reader(csvfile[, dialect='excel'][, fmtparam])

常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中[3]有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++

参数表:

有两种途径: 1、csv文件本质上也是文件文件,可以按照文件文件来进行读写操作 2、python自带csv模块,可以import csv 来通过csv.write模块来写文件

csvfile

        需要是支持迭代(Iterator)的对象,并且每次调用next方法的返回值是字符串(string),通常的文件(file)对象,或者列表(list)对象都是适用的,如果是文件对象,打开是需要加"b"标志参数。

dialect

        编码风格,默认为excel方式,也就是逗号(,)分隔,另外csv模块也支持excel-tab风格,也就是制表符(tab)分隔。其它的方式需要自己定义,然后可以调用register_dialect方法来注册,以及list_dialects方法来查询已注册的所有编码风格列表。

fmtparam

        格式化参数,用来覆盖之前dialect对象指定的编码风格。

例子:

复制代码 代码如下:

with open('test.csv')as csvfile:rows=csv.reader(csvfile)with open('test1.csv','w',newline='')as f:writer=csv.writer(f)for row in rows:row.append(row[len(row)-1])writer.writerow(row)

import csv

reader = csv.reader(file('your.csv', 'rb'))

for line in reader:

    print line

 

writer(csvfile[, dialect='excel'][, fmtparam])

参数表(略: 同reader, 见上)

例子:

复制代码 代码如下:

with open('test.csv')as csvfile:rows=csv.reader(csvfile)with open('test1.csv','w',newline='')as f:writer=csv.writer(f)for row in rows:row.append(row[len(row)-1])writer.writerow(row)

import csv

writer = csv.writer(file('your.csv', 'wb'))

writer.writerow(['Column1', 'Column2', 'Column3'])

lines = [range(3) for i in range(5)]

for line in lines:

    writer.writerow(line)

DictReader

同reader差不多,都是读取CSV用的,只不过会生成一个字典(dict)类型的返回,而不是迭代类型。

DictWriter

 我主要想说的是DictWriter,我为什么会喜欢使用DictWriter呢,因为普通的writer你需要手工去构建列表,尤其是通过表单提交的时候,而我之前因为一直在zope平台上开发,而zope支持一种高级表单数据模型,也就是可以通过定义表单的时候加入相应的标志来使提交后的表单数据自动的生成一个记录(records)类型,也就是生成一个每项数据都是一个字典的列表。这样,我就可以非常方便的直接把表单数据传给 DictWriter而生成csv,当然这个是在你能保证数据的正确性的前提下。好下面我来简单的说明一下这种zope的高级表单数据类型。

例子:

复制代码 代码如下:

with open('test.csv')as csvfile:rows=csv.reader(csvfile)with open('test1.csv','w',newline='')as f:writer=csv.writer(f)for row in rows:row.append(row[len(row)-1])writer.writerow(row)

<form action='test_form_action' method=post>

            <input type="text" name="rows.Column1:records" value="0" />

            <input type="text" name="rows.Column2:records" value="1" />

            <input type="text" name="rows.Column3:records" value="2" />

            <input type="text" name="rows.Column4:records" value="3" />

    <br />

            <input type="text" name="rows.Column1:records" value="0" />

            <input type="text" name="rows.Column2:records" value="1" />

            <input type="text" name="rows.Column3:records" value="2" />

            <input type="text" name="rows.Column4:records" value="3" />

    <br />

            <input type="text" name="rows.Column1:records" value="0" />

            <input type="text" name="rows.Column2:records" value="1" />

            <input type="text" name="rows.Column3:records" value="2" />

            <input type="text" name="rows.Column4:records" value="3" />

    <br />

            <input type="text" name="rows.Column1:records" value="0" />

            <input type="text" name="rows.Column2:records" value="1" />

            <input type="text" name="rows.Column3:records" value="2" />

            <input type="text" name="rows.Column4:records" value="3" />

    <br />

            <input type="text" name="rows.Column1:records" value="0" />

            <input type="text" name="rows.Column2:records" value="1" />

            <input type="text" name="rows.Column3:records" value="2" />

            <input type="text" name="rows.Column4:records" value="3" />

    <br />

<input type="submit" value="Submit CSV" />

</form>

表单提交后的结果是:

复制代码 代码如下:

with open('test.csv')as csvfile:rows=csv.reader(csvfile)with open('test1.csv','w',newline='')as f:writer=csv.writer(f)for row in rows:row.append(row[len(row)-1])writer.writerow(row)

rows = [{'Column1': '0', 'Column2': '1', 'Column3': '2', 'Column4': '3'},

        {'Column1': '0', 'Column2': '1', 'Column3': '2', 'Column4': '3'},

        {'Column1': '0', 'Column2': '1', 'Column3': '2', 'Column4': '3'},

        {'Column1': '0', 'Column2': '1', 'Column3': '2', 'Column4': '3'},

        {'Column1': '0', 'Column2': '1', 'Column3': '2', 'Column4': '3'}]

这样就可以直接调用DictWriter.writerows方法来处理了:

复制代码 代码如下:

with open('test.csv')as csvfile:rows=csv.reader(csvfile)with open('test1.csv','w',newline='')as f:writer=csv.writer(f)for row in rows:row.append(row[len(row)-1])writer.writerow(row)

import csv

fieldnames = ['Column1', 'Column2', 'Column3', 'Column4']

dict_writer = csv.DictWriter(file('your.csv', 'wb'), fieldnames=fieldnames)

dict_writer.writerow(fieldnames) # CSV第一行需要自己加入

dict_writer.writerows(rows)  # rows就是表单提交的数据

*注意:这里的csv文件写入需要External Method的支持,因为在zope中由于权限沙箱的问题是不能直接操作csv模块来读写文件系统的。

 

这样用起来是不是非常的方便呢,这里给出生成上面表单的DTML代码:

复制代码 代码如下:

with open('test.csv')as csvfile:rows=csv.reader(csvfile)with open('test1.csv','w',newline='')as f:writer=csv.writer(f)for row in rows:row.append(row[len(row)-1])writer.writerow(row)

<form action='test_form' method=post>

<dtml-in "range(5)">

    <dtml-in "range(4)">

        <input type="text" name="rows.Column&dtml-sequence-number;:records" value="&dtml-sequence-item;" />

    </dtml-in>

<br />

</dtml-in>

<input type="submit" value="Submit CSV" />

</form>

您可以根据您自己的需要来改写这个表单的生成。

参考文献:

http://docs.python.org/lib/module-csv.html

http://www.python.org/dev/peps/pep-0305/

'w'为擦写,即清除已有数据后写入新的。用'a+'为追加。这样就行内容来自www.zgxue.com请勿采集。

免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
Copyright © 2017 www.zgxue.com All Rights Reserved