Python之CSV模块

Stella981
• 阅读 789

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

Python之CSV模块 Python之CSV模块

#_*_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']
    #....(略)
    # 6

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文件

Python之CSV模块 Python之CSV模块

import csv
def writecsv(csvfilepath):#列表方式写入
    rows=[(100006,'小江','男','1班','77','79','80'),(100007,'小美','女','4班','77','88','80')]
    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文件

Python之CSV模块 Python之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文件

Python之CSV模块 Python之CSV模块

import csv
def writecsv2(csvfilepath):
    headers = ['学号','姓名','性别','班级','语文','数学','英语']
    rows = [{'学号':'100001','姓名':'小鱼','性别':'男','班级':'1班','语文':'72','数学':'82','英语':'85'},
            {'学号':'100002','姓名':'小高','性别':'女','班级':'6班','语文': '74', '数学': '88', '英语': '85'}
            ]
    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文件格式化参数示例

Python之CSV模块 Python之CSV模块

import csv
def writecsv3(csvfilepath):
    headers = ['学号','姓名','性别','班级','语文','数学','英语']
    rows = [{'学号':'100010','姓名':'小南','性别':'男','班级':'1班','语文':'70','数学':'89','英语':'85'},
            {'学号':'100011','姓名':'小风','性别':'女','班级':'6班','语文': '79', '数学': '89', '英语': '85'}
            ]
    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对象示例

Python之CSV模块 Python之CSV模块

import csv
def writecsv4(csvfilepath):
    csv.register_dialect('mydialect',delimiter = '*',quoting = csv.QUOTE_ALL)
    headers = ['学号','姓名','性别','班级','语文','数学','英语']
    rows = [{'学号':'100013','姓名':'小北','性别':'男','班级':'1班','语文':'70','数学':'80','英语':'85'},
            {'学号':'100014','姓名':'小琴','性别':'女','班级':'6班','语文': '77', '数学': '89', '英语': '85'}
            ]
    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() 来检测数据是否丢失。

Python之CSV模块 Python之CSV模块

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":"011334","Price":25},index=['book','Author','ISBM','Price'])
>>> obj2.isnull()
book True # 指定的index 与字典的键不匹配,发生数据丢失
Author False
ISBM True # 指定的index 与字典的键不匹配,发生数据丢失
Price False
dtype: bool

View Code

DataFrame :类似于电子表格,其数据为排好序的数据列的集合,每一列都可以是不同的数据类型,它类似于一个二维数据结构,支持行和列的索引。和Series 一样,索引会自动分配并且能根据指定的列进行排序。使用最多的方式是通过一个长度相等的列表的字典来构建。构建一个DataFrame 最常用的方式是用一个相等长度
列表的字典或NumPy 数组。DataFrame 也可以通过columns 指定序列的顺序进行排序。

Python之CSV模块 Python之CSV模块

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

View Code

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。上述两个参数对大文件处理非常有用,可以避免读入整个文件而只选取所需要部分进行读取。

Python之CSV模块 Python之CSV模块

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文件内容修改如下:

Python之CSV模块 Python之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 会直接忽略不符合要求的记录。

Python之CSV模块 Python之CSV模块

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

View Code

3)对文件进行分块处理并返回一个可迭代的对象分块处理可以避免将所有的文件载入内存,仅在使用的时候读入所需内容。参数chunksize设置分块的文件行数,2表示每一块包含2个记录。将参数iterator 设置为True时,返回值为TextFileReader,它是一个可迭代对象。来看下面的例子,当chunksize=2、iterator=True 时,每次输出为包含2个记录的块。 

Python之CSV模块 Python之CSV模块

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

View Code

>>>>>待续
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
2年前
Python编码格式导致的csv读取错误
Python编码格式导致的csv读取错误(pandas.read\_csv)本文记录python小白我今天遇到的这两个问题(csv.reader和pandas.csv\_read):pandas模块“CParserError:Errortokenizingda
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这