1. CSV简介

CSV(Comma Separated Values)是逗号分隔符文本格式,常用于Excel和数据库的导入和导出,Python标准库的CSV模块提供了读取和写入CSV格式文件的对象。

1.1 csv.reader对象和csv文件的读取

csv.reader(csvfile,dialect='excel',**fmtparams),主要用于文件的读取,返回一个reader对象用于在csv文件内容上进行行迭代。

参数csvfile是文件对象或者list对象;dialect 用于指定csv的格式模式不同程序输出的csv格式有细微差别;fmtparams是一系列参数列表,主要用于设置特定的格式,以覆盖dialect中的格式。

csv.reader对象是可迭代对象,包含以下属性:

  1. csv.reader().dialect    #返回其dialect
  2. csv.reader().line_num   #f返回读入的行数

  示例1:使用reader对象读取csv文件scores.csv,文件内容如下:

  学号,姓名,性别,班级,语文,数学,英语
  100001,小雨,女,1班,72,85,87
  100002,小雪,女,2班,67,87,77
  100003,小宇,男,3班,88,78,78
  100004,小天,男,1班,76,87,84
  100005,小军,男,3班,79,86,83

#_*_coding=utf-8
import csv
def readcsv(csvfilepath):#列表方式读取
with open(csvfilepath, 'r', newline='',encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)#创建csv.reader对象
for row in reader:
# 读取出的内容是列表格式的
print(row)
print(reader.line_num)
if __name__=='__main__':
readcsv(r'E:\2018-12-19\scores.csv')
#输出
# ['学号', '姓名', '性别', '班级', '语文', '数学', '英语']
# ['100001', '小雨', '女', '1班', '72', '85', '87']
# ['100002', '小雪', '女', '2班', '67', '87', '77']
#....(略)
#

reader对象

 1.2 csv.writer对象和csv文件的写入

  csv.writer(csvfile,dialect='excel',**fmtparams),主要用于把列表数据写入到csv文件。

  其中参数csvfile是任何支持write()方法的对象,通常为文件对象;dialect 和fmtparams与csv.reader对象构造函数中的参数意义相同。

  csv.writer对象包含以下属性和方法:

  1. writer.writerow(row)          #方法,写入一行数据
  2. writer.writerows                     #方法,写入多行数据
  3. writer.dialect                     #只读属性,返回其dialect

  示例2:  使用writer对象写入csv文件

import csv
def writecsv(csvfilepath):#列表方式写入
rows=[(100006,'小江','男','1班','','',''),(100007,'小美','女','4班','','','')]
with open(csvfilepath,'a+',newline='')as csvfile:
writer = csv.writer(csvfile,dialect='excel')
writer.writerows(rows)#写入多行
print(writer.dialect) if __name__=='__main__': writecsv(r'E:\2018-12-19\scores.csv')

writer对象

1.3 csv.DictReader对象和csv文件的读取

  使用csv.reader对象从csv文件读取数据,结果为列表对象row,需要通过索引row[i]访问。如果希望通过csv文件的首行标题字段名访问,则可以使用csv.DictReader对象读取。

csv.DictReader(csvfile,fieldnames=None,restkey=None,restval=None,dialect='excel',*args,**kwds)

  其中,csvfile是文件对象或list对象;fieldnames用于指定字段名,如果没有指定,则第一行为字段名;restkey和restval用于指定字段名和数据个数不一致时所对应的字段名或数据值,其他参数同reader对象。

  DictReader对象属性和方法: 

  # 方法:
  csv.DictReader().__next__()# 称之为next(reader)
  # 属性:
  csvreader.dialect          # 解析器使用的方言的只读描述。
  csvreader.line_num      #返回读入的行数
  csvreader.fieldnames   #返回标题字段名

  示例3 :使用DictReader对象读取csv文件

import csv
def readcsv2(csvfilepath):
with open(csvfilepath,newline='') as f:
f_csv = csv.DictReader(f)
for row in f_csv:
print(row['姓名'],row['班级'])
# print('fieldnames:',f_csv.fieldnames)
# print('dialect:',f_csv.dialect)
# print('line_num:',f_csv.line_num) if __name__=='__main__':
readcsv2(r'E:\2018-12-19\scores.csv')

DictReader对象

 1.4 csv.DictWriter对象和csv文件的写入

  csv.DictWriter(csvfile,fieldnames,restval = '',extrasaction = 'raise',dialect = 'excel',*args,**kwds)

  extrasaction用于指定多余字段时的操作,其他参数同上。

  DictWriter对象的属性和方法:

# 方法:
  csvwriter.writerow(row)               # 将row写入writer的文件对象,根据当前方言进行格式化。支持迭代
  csvwriter.writerows(rows)           # 将行中的所有元素写入编写器的文件对象,并根据当前方言进行格式化。支持迭代
  DictWriter.writeheader()              # 写入标题字段名
  # 属性:
  csvwriter.dialect # 使用的方言只读描述
  示例4 :使用DictWriter对象写入csv文件

import csv
def writecsv2(csvfilepath):
headers = ['学号','姓名','性别','班级','语文','数学','英语']
rows = [{'学号':'','姓名':'小鱼','性别':'男','班级':'1班','语文':'','数学':'','英语':''},
{'学号':'','姓名':'小高','性别':'女','班级':'6班','语文': '', '数学': '', '英语': ''}
]
with open(csvfilepath,'a+',newline='') as f:
f_csv = csv.DictWriter(f,headers)
f_csv.writerows(rows)
if __name__=='__main__': writecsv2(r'E:\2018-12-19\scores.csv')

DictWriter对象

 1.5 csv文件格式化参数和Dialect对象

  1.5.1 csv 文件格式化参数

  创建reader/writer对象时,可以指定csv文件格式化命名参数。

  参数说明:
  delimiter  用于分隔字段的分隔符。默认为","
  lineterminator  用于写操作的行结束符,默认为“'\r\n ' 。读操作将忽略此选项,它能认出跨平台的行结束符
  quotechar  用于带有特殊字符(如分隔符)的字段的引用符号。默认为' " '
  quoting  引用约定。可选值包括

      csv.QUOTE _ ALL (引用用所有字段)
      csv.QUOTE_MINIMAL(引用如分隔符之类特殊字符的字段)默认
      csv.QUOTE_NONNUMERIC (非数字字段)
      csv.QUOTE_NON (不引用)
  skipinitialspace  忽略分隔符后面的空白符。默认为False
  doublequote  如何处理字段内的引用符号。如果为True ,字符串中的双引号使用" "表示;如果为False,使用转义字符escapechar指定的字符
  escapechar 用于对分隔符进行转义的字符串

  strict 如果为True,读入错误格式的CSV行时将导致csv.Error;默认值为False

  示例5 :csv文件格式化参数示例

import csv
def writecsv3(csvfilepath):
headers = ['学号','姓名','性别','班级','语文','数学','英语']
rows = [{'学号':'','姓名':'小南','性别':'男','班级':'1班','语文':'','数学':'','英语':''},
{'学号':'','姓名':'小风','性别':'女','班级':'6班','语文': '', '数学': '', '英语': ''}
]
with open(csvfilepath,'a+',newline='') as f:
f_csv = csv.DictWriter(f,headers,delimiter = ',',quoting = csv.QUOTE_ALL)
f_csv.writerows(rows)
if __name__=='__main__': writecsv3(r'E:\2018-12-19\scores.csv')

csv文件格式化

  1.5.2 Dialect 对象

  若干格式化参数可以组成Dialect对象,Dialect对象包含对应于命名格式化参数的属性。可以创建 Dialect或其派生类的对象,然后传递给reader或writer的构造函数

  可以使用下列csv模块的函数,创建Dialect对象。

  csv.register_dialect(name[,dialect],**fmtparams):使用命名参数,注册一个名称。

  csv.unregister_dialect(name):取消注册的名称。

  csv.get_dialect(name):获取注册的名称的Dialect对象,无注册时csv.Error。

  csv.list_dialects():所有注册Dialect对象的列表。

另外可以使用csv模块函数,获取和设置字段的长度限制:csv.filed_size_limit([new_linit])

  示例6:Dialect对象示例

import csv
def writecsv4(csvfilepath):
csv.register_dialect('mydialect',delimiter = '*',quoting = csv.QUOTE_ALL)
headers = ['学号','姓名','性别','班级','语文','数学','英语']
rows = [{'学号':'','姓名':'小北','性别':'男','班级':'1班','语文':'','数学':'','英语':''},
{'学号':'','姓名':'小琴','性别':'女','班级':'6班','语文': '', '数学': '', '英语': ''}
]
with open(csvfilepath,'a+',newline='') as f:
f_csv = csv.DictWriter(f,headers,dialect='mydialect')
f_csv.writerows(rows)
if __name__=='__main__': writecsv4(r'E:\2018-12-19\scores.csv')

dialect对象

 2. 使用pandas处理大型csv文件

 2.1 pandas简介

Pandas 即Python Data Analysis Library,是为了解决数据分析而创建的第三方工具,它不仅提供了丰富的数据模型,而且支持多种文件格式处理,包括CSV、HDF5、HTML 等,能够提供高效的大型数据处理。其支持的两种数据结构——Series 和DataFrame——是数据处
理的基础。下面先来介绍这两种数据结构。
Series:它是一种类似数组的带索引的一维数据结构,支持的类型与NumPy兼容。如果不指定索引,默认为0到N-1。通过obj.values() 和obj.index() 可以分别获取值和索引。当给Series 传递一个字典的时候,Series 的索引将根据字典中的键排序。如果传入字典的时候同时重新指定了index 参数,当index 与字典中的键不匹配的时候,会出现时数据丢失的情况,标记为NaN。在pandas 中用函数isnull() 和notnull() 来检测数据是否丢失。
import pandas

>>> obj1 = Series([1, 'a', (1,2), 3], index=['a', 'b', 'c', 'd'])
>>> obj1#value 和index 一一匹配
a 1
b a
c (1, 2)
d 3
dtype: object
>>> obj2=Series({"Book":"Python","Author":"Dan","ISBN":"","Price":25},index=['book','Author','ISBM','Price'])
>>> obj2.isnull()
book True # 指定的index 与字典的键不匹配,发生数据丢失
Author False
ISBM True # 指定的index 与字典的键不匹配,发生数据丢失
Price False
dtype: bool
DataFrame :类似于电子表格,其数据为排好序的数据列的集合,每一列都可以是不同的数据类型,它类似于一个二维数据结构,支持行和列的索引。和Series 一样,索引会自动分配并且能根据指定的列进行排序。使用最多的方式是通过一个长度相等的列表的字典来构建。构建一个DataFrame 最常用的方式是用一个相等长度
列表的字典或NumPy 数组。DataFrame 也可以通过columns 指定序列的顺序进行排序。
data = {'OrderDate': ['1-6-10', '1-23-10', '2-9-10', '2-26-10', '3-15-10'],
... 'Region': ['East', 'Central', 'Central', 'West', 'East'],
... 'Rep': ['Jones', 'Kivell', 'Jardine', 'Gill', 'Sorv ino']}
>>>
>>> DataFrame(data,columns=['OrderDate','Region','Rep'])# 通过字典构建,按照cloumns指定的顺序排序
OrderDate Region Rep
0 1-6-10 East Jones
1 1-23-10 Central Kivell
2 2-9-10 Central Jardine
3 2-26-10 West Gill
4 3-15-10 East Sorvino
2.2 pandas处理csv文件

Pandas中处理CSV文件的函数主要为read_csv()和to_csv()这两个,其中read_csv()读取CSV文件的内容并返回DataFrame,to_csv() 则是其逆过程。
1)读取指定行和列的数据
具体的实现代码如下:
df = pd.read_csv("SampleData.csv",nrows=5,usecols=['OrderDate','Item','Total'])
方法read_csv()的参数nrows 指定读取文件的行数,usecols 指定所要读取的列的列名,如果没有列名,可直接使用索引0、1、...、n-1。上述两个参数对大文件处理非常有用,可以避免读入整个文件而只选取所需要部分进行读取。
import pandas as pd
def readcsv3(csvfilepath):
df = pd.read_csv(csvfilepath, nrows=3, usecols=['学号', '姓名','班级'],encoding='gbk')
print(df) if __name__=='__main__':
readcsv3(r'E:\2018-12-19\scores.csv')
#输出
# 学号 姓名 班级
# 0 100001 小雨 1班
# 1 100002 小雪 2班
# 2 100003 小宇 3班

读取指定行和列

如果出现错误提示:UnicodeDecodeError: 'ascii' codec can't decode byte 0xb8

原因:含有中文字符,将encoding设置为gbk

2)设置CSV文件与excel兼容
将scores.csv文件内容修改如下:
学号,姓名,性别,班级,语文,数学,英语
100001,小雨,女,1班,72,85,87
100002,小雪,女,2班,67,87,77
100003,小宇,小白,男,3班,88,78,78
100004,小天,男,1班,76,87,84
100005,小军,男,3班,79,86,83
100006,小江,男,1班,77,79,80,44
100007,小美,女,4班,77,88,80,44
100001,小鱼,男,1班,72,82,85,33
100002,小高,女,6班,74,88,85,77

Scores.csv

下面的代码用于设置CSV 文件与excel 兼容,error_bad_lines=False 会直接忽略不符合要求的记录。
import pandas as pd
def readcsv4(csvfilepath):
dia = csv.excel()
df = pd.read_csv(csvfilepath, dialect=dia, error_bad_lines=False,encoding='gbk')
print(df) if __name__=='__main__':
readcsv4(r'E:\2018-12-19\scores.csv')
#输出
# 学号 姓名 性别 班级 语文 数学 英语
# 0 100001 小雨 女 1班 72 85 87
# 1 100002 小雪 女 2班 67 87 77
# 2 100004 小天 男 1班 76 87 84
# 3 100005 小军 男 3班 79 86 83
3)对文件进行分块处理并返回一个可迭代的对象
分块处理可以避免将所有的文件载入内存,仅在使用的时候读入所需内容。参数chunksize设置分块的文件行数,2表示每一块包含2个记录。将参数iterator 设置为True时,返回值为TextFileReader,它是一个可迭代对象。
来看下面的例子,当chunksize=2、iterator=True 时,每次输出为包含2个记录的块。
import pandas as pd
def readcsv5(csvfilepath):
df = pd.read_csv(csvfilepath,encoding='gbk',chunksize=2,iterator=True)
print(df)#<pandas.io.parsers.TextFileReader object at 0x00000293FA870320>
print(iter(df).__next__()) if __name__=='__main__':
readcsv5(r'E:\2018-12-19\scores.csv')
#输出
# 学号 姓名 性别 班级 语文 数学 英语
# 0 100001 小雨 女 1班 72 85 87
# 1 100002 小雪 女 2班 67 87 77

>>>>>待续

Python之CSV模块的更多相关文章

  1. python中csv模块和join函数的使用

    在看项目的时候恰好又碰到了这两个功能,然后稍微记录一下,关于join函数,是一个经常使用的联合函数,作用就是用自己规定的字符去串联字符串和列表之类的,对于字符串来说,join函数针对的是字符串中的每一 ...

  2. Python中csv模块解析

    导入模块 import csv 2.读取csv文件 file1 = open('test1.csv', 'rb') reader = csv.reader(file1) rows = [row for ...

  3. python 利用csv模块导入数据

  4. python 内建模块与第三方模块

    *)datetime模块 包括时间.时间对象.时间戳.时区.时区的转换 参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/101764878 ...

  5. Python CSV模块处理文件读写

    下面是一个简单的csv文件 Title,Release Date,Director And Now For Something Completely Different,1971,Ian MacNau ...

  6. python csv模块的reader是一个迭代器,无法多次迭代

    在一个项目中,我需要多次遍历一个文本,该文本我是用csv.reader读取的.但后来发现,本文只对第一次循环有用,而之后的循环均为空白.经过排错后,我确定问题就出现在csv.reader()这一步.之 ...

  7. Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块

    Python第十一天    异常处理  glob模块和shlex模块    打开外部程序和subprocess模块  subprocess类  Pipe管道  operator模块   sorted函 ...

  8. Python csv模块的使用

    1.csv简介 CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本 格式,用以存储表格数据,包括数字或者字符.很多程序在 ...

  9. Python CSV模块简介

    Table of Contents 1. CSV 1.1. 简介 1.2. 字典方式地读写 1.3. 其它 2. 参考资料 CSV csv文件格式是一种通用的电子表格和数据库导入导出格式.最近我调用R ...

随机推荐

  1. SIS

    故障: 1.2017-12-14  发现前期测试的钉钉切换校区功能有遗留问题,第二个校区进行考勤后,在考勤记录中编辑考勤记录,出现无权限 原因:编辑考勤记录,传的schoolid不是原先的school ...

  2. Golang Template source code analysis(Parse)

    This blog was written at go 1.3.1 version. We know that we use template thought by followed way: fun ...

  3. js的内建arguments数组

    调用函数时,只需在函数名后加一对用于传递参数的括号即可.var result = sum(1,2) 如果调用参数(a,b)的时候没有给值,则值默认为undefined.即使传递参数过多,多余的部分也会 ...

  4. 【BZOJ 1370】 团伙

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1370 [算法] 并查集 + 拆点 [代码] #include<bits/std ...

  5. org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.demo.pojo.IdCard

    转自:https://blog.csdn.net/zheng0518/article/details/11029733 TestStudent.testSchemaExporttestSchemaEx ...

  6. vmware 14黑屏处理办法

    从12升级到了14,但是发现所有的虚拟机都不能用了,黑屏.挂起的时候反而会显示界面,但是继续运行就是黑屏. 记录下解决办法. 修复LSP 以管理员身份运行CMD命令: netsh winsock re ...

  7. C - Stones on the Table

    Problem description There are n stones on the table in a row, each of them can be red, green or blue ...

  8. Spring Boot (2) Restful风格接口

    Rest接口 动态页面jsp早已过时,现在流行的是vuejs.angularjs.react等前端框架 调用 rest接口(json格式),如果是单台服务器,用动态还是静态页面可能没什么大区别,如果服 ...

  9. rabbitmq镜像模式初体验

    rabbitmq-01: yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm wget ...

  10. SQL Server 一个简单的游标

    先看一下原表: DECLARE @id INT; DECLARE @name NVARCHAR(100); DECLARE c_department CURSOR FOR SELECT StuID, ...