本文约2700字,建议阅读时间13~18分钟

关键字:python,逗号分隔文件,字符分割,csv

逗号分隔文件是电子表格和数据库的常用输入与输出格式。

1、相关函数

(1)csv格式数据读取

reader(csvfile,dialect=’excel’,**)

其中csvfile可以是任意支持迭代并每次返回一个字符串的对象,例如文件对象和列表对象,如果csvfile是一个文件对象,那么它应该可以通过newline=’ ’打开。reader函数读取的每一行将被当作字符串列表返回。

access分割CSV文件 怎么分割csv文件_c++ 写入文件

from csv import reader
with open('read.csv',newline='') as csvfile:
    csv_reader= reader(csvfile,delimiter=’ ’)
    for row in csv_reader:
       print(','.join(row))

返回:

1,2,3,4,5,
a,b,c,d,e,f
!,@,#,,,

注:

(1)open中的文件名参数为绝对路径文件名,含文件格式;

(2)每行元素以行元素最多的元素数目为准,缺失以空串填充;

(2)csv格式数据写入

writer(csvfile,dialect=’excel’,**)
from csv import writer
with open('write.csv','w',newline='') as csvfile:
    csv_writer=writer(csvfile)
    csv_writer.writerow(['aa','bb','cc','dd'])
    csv_writer.writerow(['mm','nn','ll'])

#将在当前工作目录生成write.csv文件

access分割CSV文件 怎么分割csv文件_access分割CSV文件_02

(3)dialect相关

注册dialect的名称

register_dialect(name[,dialect[,**]])

其中name为名称字符串,备选参数dialect可以是Dialect的子类、关键词参数或者两者均包括。

删除已注册名称的dialect

unregister_dialect(name)

如果name不是一个注册的dialect名称,那么将抛出Error。

返回指定名称的不可变dialect

get_dialect(name)

如果name不是一个注册的dialect名称,那么将抛出Error。

返回所有已经注册的dialect名称

list_dialects()

(4)字段大小的最大值

field_size_limit()

#返回当前程序允许的字段大小的最大值

field_size_limit(new_limit)

#设置字段大小最大值为new_limit(下次调用返回new_limit),但仍返回之前的最大值

2、相关类

(1)字典读取器:DictReader

DictReader(f,fieldnames=None,restkey=None,restval=None,dialect=’excel’,*args,**kwargs)
#当fieldnames省略时,默认取f中的第一行为相应的字段名
#当非空行元素数大于fieldnames字段数时,restkey为余下所有字段的名称,默认为None,且余下所有字段的值组成的列表作为相应的值
#当非空行元素数小于fieldnames字段数时,restval为余下所有元素的值,默认为None
#python3.8返回dict对象,python3.6返回OrderedDict对象
#从dialect及剩余的参数与reader参数相同
from csv import DictReader
with open('read.csv',newline='') as csvfile:
    dict_reader=DictReader(csvfile,fieldnames=['A','B','C','D','E'])
    for row in dict_reader:
        print(row)

返回:

{'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5', None: ['']}
{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd', 'E': 'e', None: ['f']}
{'A': '!', 'B': '@', 'C': '#', 'D': '', 'E': '', None: ['']}

(2)字典写入器:DictWriter

DictReader(f,fieldnames,restval=’’,extrasaction=’raise’,dialect=’excel’,*args,**kwargs)
#fieldnames必须给定
#restval为不在fieldnames中的字段的值,默认为’’
#当writerow方法写入字典时,如果写入字典中的键不在fieldnames中,且extrasaction为’raise’(默认值)时,则抛出ValueError,如果为’ignore’时,则忽略掉
#从dialect及剩余的参数与reader参数相同
from csv import DictWriter
with open('write.csv','w',newline='') as csvfile:
    fieldnames=['A','B','C','D']
    dict_writer=DictWriter(csvfile,
        fieldnames=fieldnames,
        restval='-',
        extrasaction='ignore')
    dict_writer.writerow({'A':'aa','B':'bb','C':'cc','D':'dd'})
    dict_writer.writerow({'A':'mm','B':'nn','C':'ll'})
    dict_writer.writerow({'A':'xx','B':'yy','E':'zz'})
#将在当前工作目录生成write.csv文件

access分割CSV文件 怎么分割csv文件_access分割CSV文件_03

(3)Dialect类

csv.Dialect:主要依赖于定义reader和writer参数的属性的容器类

csv.excel:定义由Excel生成的逗号分隔符文件的常用属性的类,dialect注册名称为’excel’

csv.excel_tab:定义由Excel生成的tab键分隔符文件的常用属性的类,dialect注册名称为’excel_tab’

csv.unix_dialect:定义在unix系统中生成的csv文件的常用属性的类,dialect注册名称为’unix’

(4)行特征探测类:Sniffer

sniff(sample):分析给定样本行并返回相应关键字参数的Dialect子类

from csv import Sniffer,reader
with open(file_csv,newline='') as csvfile:
    dialect=Sniffer().sniff(csvfile.read(2))
    csvfile.seek(0)
    new_reader=reader(csvfile,dialect)
    for row in new_reader:
        print(','.join(row))

返回:

1,2,3,4,5,
a,b,c,d,e,f
!,@,#,,,

#通常不对csv文件的第一行进行探测,最好对能明显识别出分隔符的行进行探测

#主要用于不知道csv文件的关键字参数的时候使用,但需谨慎使用

has_header(sample):分析给定样本的第一行是否是字段名

3、相关常数

csv.QUOTE_ALL:写入对象时引用所有的字段

csv.QUOTE_MINIMAL:写入对象时引用那些包含特殊字符,如分隔符、配对符、终止符等的字段

csv.QUOTE_NONNUMERIC:写入对象时引用所有非数值型字段;读取对象时将非数值型字段转换为浮点型

csv.QUOTE_NONE:写入对象时不引用任何字段

4、异常:csv.Error

#相关函数中一旦某个错误被检测到,将抛出Error异常

5、Dialect与格式化参数

为了得到格式化的数据,我们可以将一些特别的格式化参数组合起来作为Dialect的属性,当然我们也可以逐个设置格式化参数来配置,并且可以重新修改相应的格式化参数。

(1)Dialect.delimiter

单个字符的字段分隔符,默认值为’,’

(2)Dialect.doublequote

控制出现在字段内的引用字符实例如何被引用,当为True时(默认值)表示双引用字符,否则在引用字符前加转义字符。在输出中,如果doublequote为False并且没有设置转义字符,在字段中发现引用字符将抛出Error

(3)Dialect.escapechar

如果引用设置为QUOTE_NONE并且引用字符的doublequote设置为False,单个字符的转义字符在写入数据时对分隔符进行转义。在读取数据时,转义字符去掉了随后字符的特别意义,该属性默认为None,即非转义

(4)Dialect.lineterminator

在写入数据时指定的行终止符,默认为’\r\n’

(5)Dialect.quotechar

用于引用包含分隔符、引用字符或者newline字符等特殊字符的字段的单个字符,默认值为空串‘‘’’

(6)Dialect.quoting

控制在写入数据时生成引用或者在读取数据时识别引用,它可以被设置成QUOTE_*中的任一常数,默认值为QUOTE_MINIMAL

(7)Dialect.skipinitialspace

当为True时,分隔符后的空白符将被忽略,默认值为False

(8)Dialect.strict

当为True时,糟糕的csv输入将抛出Error异常,默认值为False

6、读取器对象Reader

(1)公共方法

csvreader.__next__()

#返回reader迭代对象的下一行

#也可以使用next(reader)

(2)公共属性

csvreader.dialect

程序中对dialect的可读描述

csvreader.line_num

源迭代对象中读取的行数

csvreader.fieldnames

第一次读取时的字段名,仅适用于DictReader对象

7、写入器对象Writer

(1)公共方法

csvwriter.writerow(row)
#写入一行
#row为可迭代对象
csvwrite.writerows(rows)
#按照rows中每一个元素写入一行
#rows为可迭代对象,且其中每个元素亦为可迭代对象
with open(‘write.csv’,'w',newline='') as csvfile:
    Writer=writer(csvfile)
    Writer.writerows(['aa','bbc','cc','ddee'])

生成如下csv文件:

access分割CSV文件 怎么分割csv文件_access分割CSV文件_04

DictWriter.writeheader()
#写入带有字段的一行
with open(file_csv,'w',newline='') as csvfile:
    fieldnames=['A','B','C','D']
    dict_writer=DictWriter(csvfile, 
        fieldnames=fieldnames, 
        extrasaction='ignore',
        restval='-')
    dict_writer.writeheader()
    dict_writer.writerow({'A': 'aa', 'B': 'bb', 'C': 'cc', 'D': 'dd'})
    dict_writer.writerow({'A': 'mm', 'B': 'nn', 'C': 'll'})
    dict_writer.writerow({'A': 'xx', 'B': 'yy', 'E': 'zz'})

返回如下文件:

access分割CSV文件 怎么分割csv文件_c++读取csv文件_05

 (2)公共属性

csvwriter.dialect

写入数据时对dialect的可读描述

(完)