首页 > 其他分享 >CSV:CSV文件的读写库

CSV:CSV文件的读写库

时间:2022-12-04 22:12:29浏览次数:60  
标签:文件 csv name dialect 读写 writer file reader CSV

CSV 格式的全称是 Comma Separated Values,意思是逗号分割的数据,是最常见的电子表格和数据库的导出格式之一,在 RFC 4180 中已经成为了一种标准格式。Python 中提供了一个官方的标准库来处理这种文件类型,那就是 CSV 库。

官方文档在此:CSV


文件的基本读写

文件的读写主要使用 csv.readercsv.writer 来完成,它的定义如下:

csv.reader(csvfile, dialect='excel', **fmtparams)
  1. csvfile:返回字符串的迭代器,一般是 open 函数返回的文件对象
  2. dialect:用来读取非标准 csv 格式的指定参数,这部分参考下文
  3. **fmtparams:用来指定格式的参数,这部分的详细参数参考下文

最简单、最常用的使用方法是将 open 函数返回的文件对象直接丢给 csv.reader 就会得到一个每次返回一个拆分后的字符串列表的迭代器:

import csv
with open('file.csv', 'r') as input_file:
    file_content = csv.reader(input_file, delemiter=',')
    for row in file_content:
        # code here
        pass

类似地,对文件的写操作与原生方法类似:

import csv
with open('file.csv', 'w', newline='') as output_file:
    file_writer = csv.writer(output_file, delimiter=',')
    file_writer.writerow(['Spam'] * 5 + ['Baked Beans'])
    file_writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

用字典模式处理数据

有时候,我们可能需要将数据读取成字典(例如要上传到 MongoDB 的时候),这时候我们可以使用 csv.DictReader 将表格形式的数据读取为字典形式的数据

这个函数的参数如下:

csv.DictReader(
    f,
    fieldnames=None,
    restkey=None, restval=None,
    dialect='excel',
    *args, **kwds
)
  1. f:可迭代对象或者文件对象
  2. fieldnames:一个有序列表,代表字典中的字段(一般是文件的列名),如果不指定,就用文件的第一行的字符串来作为字段的名字
  3. restkey:如果列名的数量少于内容的列数,那么剩下的列就会被统一放到一个字段里,这里的 restkey 就是这个字段的名字,默认为 None
  4. restval:与 restkey 类似,如果内容的列数少于列名的数量,那么内容中缺少的列就会被填充,这个参数指定用来填充的值,默认为 None
  5. 其他的参数与 csv.reader 相同

一个简单的示例如下:

import csv
with open('file.csv') as input_file:
    reader = csv.DictReader(input_file)
    for row in reader:
        print(row['first_name'], row['last_name'])

# Eric Idle
# John Cleese

print(row)
# {'first_name': 'John', 'last_name': 'Cleese'}

类似地,字典的写通过 csv.DictWriter 来完成,这个函数将字典类型的数据输出为表格形式的数据csv.DictWriter 的参数如下:

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

csv.DictWriter 类似,fieldnames 指定所有的字段名称,restval 用来指定当指定字段有缺失值的时候用来填充的内容,extrasaction 参数用来指定内容缺少字段时的操作,默认会 'raise',即引发一个 ValueError 异常,可以设置为 'ignore',对应着忽略额外值,一个示例如下:

import csv

with open('names.csv', 'w', newline='') as output_file:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(output_file, fieldnames=fieldnames)
    # 将
    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})

非标准格式的处理

有时候,csv 的文件可能不是标准的 csv 文件,无法直接读取,这时候我们需要指定一些额外参数来处理这些情况,这种情况下需要用到 dialect 功能,这个功能包含若干类和若干函数来帮助我们实现我们的目的。

dialect

默认情况下,三个 dialect 类型是内置的,分别是 'unix''excel'、和 'excel_tab''unix' 模式用来处理在 Unix 系统下生成的文件,而 'excel' 模式用来处理 excel 生成的 csv 文件,最后的 'excel_tab' 用来处理 excel 生成的制表符分割的文件,这三种预设已经覆盖了绝大多数的使用场景。

用户可以使用 Dialect 类来自定格式的处理:

csv.register_dialect(
    'unixpwd',
    delimiter=',',
    quoting=csv.QUOTE_MINIMAL,
    quotechar='"',
    doublequote=True,
    escapechar=None,
    lineterminator='\r\n',
    skipinitialspace=False,
    strict=False
)
  1. name:自定义的格式名称
  2. delimiter:用来分割各字段的字符,默认为 ,
  3. doublequote:没啥用,看不懂,待补充
  4. escapechar:没啥用,一般不用
  5. lineterminator:换行符,默认是 '\r\n'
  6. quotechar:当字段含有特殊字符是,用来引用的符号,默认是 ",不用改,不常用
  7. quoting:加引号的行为,可以选择 QUOTE_ALLQUOTE_MINIMALQUOTE_NONNUMERICQUOTE_NONE 四种行为
  8. skipinitialspace:是否跳过分隔符后面的空格,默认为 False
  9. strict:严格模式,如果为 True,文件格式不对的时候会报错终止,否则会强制读取

使用方法就是先使用csv.register_dialect注册一个自定义dialect,然后在reader里面指定它:

import csv
csv.register_dialect(
    'unixpwd',
    delimiter=':',
    quoting=csv.QUOTE_NONE,
    ...
)
with open('passwd', newline='') as f:
    reader = csv.reader(f, 'unixpwd')

Sniffer

正如它的名字,sniffer 提供了对格式的自动检测,并输出一个 dialect,提供了两个函数,分别是 has_header,用来检测文件是否包含标题行,和主函数 sniff,这里通过一个例子来学习它的使用:

with open('example.csv', newline='') as csvfile:
    # 通过文件的前1024行来确定文件的格式规范
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    # 将指针重置,从文件开始进行读取
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... process CSV file contents here ..

标签:文件,csv,name,dialect,读写,writer,file,reader,CSV
From: https://www.cnblogs.com/wdyyy/p/python_csv.html

相关文章

  • Mysql主从复制,读写分离
    一、Mysql主从复制概述在企业中,业务数据量通常都比较大,单台Mysql在安全性,高可用性和高并发方面都无法满足实际需求,因此可以通过主从复制的方式来同步数据,再通过读写分离来提......
  • 实验六 模板类和文件I/O
    task3_1:1#include<iostream>2#include<fstream>3#include<array>4#defineN556intmain(){7usingnamespacestd;89array<......
  • MYSQL主从复制与读写分离
    一、MySQL主从复制的理论部分1.1mysql支持的复制类型STATEMENT∶基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效......
  • csv文件保存
    #爬取起点中文网的书名作者并用csv文件保存importrequestsimportcsvfromlxmlimportetreeua={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/......
  • 实验6 模板类和文件I/O
    实验任务31#include<iostream>2#include<fstream>3#include<array>4#defineN55intmain(){6usingnamespacestd;7array<int,N>x{......
  • 实验6 模板类和文件IO
    一、实验任务三1.源代码:task3_1.cpp#include<iostream>#include<fstream>#include<array>#defineN5intmain(){usingnamespacestd;array<int,N>x{97,9......
  • 实验6 模板类和文件I/O
    实验任务3task3_11#include<iostream>2#include<fstream>3#include<array>4#defineN556intmain(){7usingnamespacestd;8array<in......
  • split-切割文件
    1、描述作用:切割文件,将文件以行为单位或以字节为单位进行切割语法:split[-bl]file[name]2、参数参数描述-b后面可接欲分割成的档案大小,可加单位,例如b、k、m等-l......
  • 把本地项目文件夹改为git仓库并关联到远端分支(非主分支)
    问题本地已有代码目录am_flow,而且不是git仓库远端git仓库am_flow,有main主分支和branch分支dev_hq,有些许文件,基本为空目录目标:把本地代码目录关联上远端git仓库am_flow......
  • 压缩指定文件夹下所有文件夹,并输出压缩后的文件列表
    1,赋值下面代码另存为:compressionSpecifiedPath.bat 注意文件后缀为(.bat)echooff&color0A@echooff&setlocalenabledelayedexpansionrem压缩指定目录下所有......