python常用模块-csv

自己的笔记有点儿乱,从csdn上随便找了两篇: 

 

Python使用csv模块读写csv文件
csv是逗号分隔值(Comma-Separated Values)的简称。

有时也称为字符分隔值,因为分隔字符也可以不是逗号,其文件以纯文本形式存储表格数据。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。

csv可以存储各种各样的数据,不过,通常来说,比较适合存储有相同字段或表头的一批数据,这些数据可以展示成表格。

可以使用excel开启csv文件,打开后看到的数据以excel表格的方式进行展示。

现在我们就开始使用csv将数据写入csv文件,然后将数据从csv中读取出来使用。

一、将数据写入csv文件中

import csv


csv_data = (
(1, 2, 3, 4, 5, 6),
('a', 'b', 'c', 'd', 'e', 'f'),
('p', 'y', 't', 'h', 'o', 'n')
)
output_file_name = 'csv_file.csv'


def save_csv(target_list, output_file_name):
"""
将数据写入csv文件
"""
if not output_file_name.endswith('.csv'):
output_file_name += '.csv'
csv_file = open(output_file_name, "w", newline="")
key_data = target_list[0]
value_data = [target for target in target_list]
csv_writer = csv.writer(csv_file)
csv_writer.writerow(key_data)
csv_writer.writerows(value_data)
csv_file.close()


save_csv(csv_data, output_file_name)
代码描述:

1.我们先将需要保存的数据解析好,保存成固定的数据类型(保存成列表,元组,字典都可以,根据具体场景来选择)

2.我们将保存数据到csv文件的代码封装成一个函数,方便重用。步骤主要分为三步:打开文件,写入数据,关闭文件。其中,写入数据时记得先写入表头(我们使用excel打开时需要表头)再写入表格中的数据,数据要以一个列表的形式传递给writerows()。

运行结果:

运行以上代码后,会在当前目录下创建一个csv_file.csv的文件,并写入csv_data的数据,可以使用excel打开文件查看。如下图。

 

二、从csv文件中读取数据

input_file_name = 'csv_file.csv'


def read_csv(input_file_name):
"""
读取csv文件数据
"""
with open(input_file_name, 'r', encoding='utf-8') as csv_file:
csv_reader = csv.reader(csv_file)
# csv_reader对象,是一个列表的格式
print(csv_reader)
# csv_reader对象的一个迭代器,可以通过next()取出其中的元素
print(next(csv_reader))
# 也可以通过for循环取出所有元素
for line in csv_reader:
print(''.join(line))


read_csv(output_file_name)
代码描述:

1.可以通过with上下文管理的方式打开csv文件,如果想在with的代码块外对读出来的数据进行处理,则可以使用open()打开,再使用close()关闭。

2.csv通过csv.reader()来打开csv文件,返回的是一个列表格式的迭代器,可以通过next()方法获取其中的元素,也可以使用for循环依次取出所有元素。

运行结果:

<_csv.reader object at 0x00000295BC044528>
['1', '2', '3', '4', '5', '6']
123456
abcdef
python
这样,将数据写入csv和从csv中读取数据就完成了,使用过程是非常简单的。
————————————————
版权声明:本文为CSDN博主「Python碎片」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43790276/article/details/90572596

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

python csv模块  

# CSV以纯文本存储数和文本。文件的每一行就代表一条数据,每条记录包含由逗号分隔一个或多个属性值。 

1.说明:

1) 默认读写用逗号做分隔符(delimiter),双引号作引用符(quotechar)
2) 用writer写数据None被写成空字符串,浮点型调用repr()转化成字符串。非字符串型数据被str()成字符串存储。
3) open函数
import locale ; locale.getpreferredencoding()# 查看本地编码'cp936'
open('some.csv', newline='', encoding='utf-8')
# 使用系统默认编码将文件解码为unicode可使用不同的编码解码文件
# 如果newline=''没有指定,嵌入引用字段内换行符将不会被正确地解释
4)RFC 4180 提供了一些标准:
# 内容为纯文本;包含记录
# 每条记录是用单个分隔字符将各属性分隔
# 每条记录的属性序列是相同的pandas可以通过PyPI的 pip安装 。 
2.模块内容 

2.1模块常量:引用约定

quoting=csv.QUOTE_MINIMAL =0 # writer对象只引用那些包含特殊字符
quoting=csv.QUOTE_ALL=1 # writer对象引用所有字段
# 如字段分隔符,quotechar或任何字符 lineterminator。
quoting=csv.QUOTE_NONNUMERIC=2 # writer对象引用所有非数字字段。
# 指示读者将所有非引用字段转换为float类型。
quoting=csv.QUOTE_NONE=3,escapechar='$'# writer对象不引用字段
# 如未设置escapechar错误抛出;指示reader不对引号字符执行特殊处理。 
2.21.函数:

csv.reader(f,dialect ='excel',** fmtparams )# 返回一个读取器对象,它将迭代给定csv文件中的行。
# 属性:
csv.reader().dialect
csv.reader().line_num

csv.writer(f,dialect ='excel',** fmtparams ) # 返回一个编写器对象,负责将用户的数据转换为给定类文件对象上的分隔字符串
# 属性方法:
writer.writerow
writer.writerows
writer.dialect

csv.DictReader()#字典读
# 方法:
csv.DictReader().__next__()# 称之为next(reader)

# 属性:
csvreader.dialect # 解析器使用的方言的只读描述。
csvreader.line_num # 从源迭代器读取的行数。这与返回的记录数不同,因为记录可以跨越多行。
csvreader.fieldnames# 从文件中读取第一条记录时初始化此属性

csv.DictWriter()
# 方法:
csvwriter.writerow(row) # 将row写入writer的文件对象,根据当前方言进行格式化。支持迭代
csvwriter.writerows(rows)# 将行中的所有元素写入编写器的文件对象,并根据当前方言进行格式化。支持迭代
DictWriter.writeheader() # 公共方法:用字段名称写一行

# 属性:
csvwriter.dialect # 使用的方言只读描述 
2.22函数-方言 

csv.register_dialect(name [,dialect [,** fmtparams ] ] )
# 将方言与名称联系起来。 name必须是一个字符串。
# 方言可通过传递子类Dialect或fmtparams关键字参数或两者来指定,并使用关键字参数覆盖方言的参数。

csv.unregister_dialect(name)
# 从方言注册表中删除与名称关联的方言。名称不存在抛出错误

csv.get_dialect(name)
# 返回与姓名相关的方言,不可变的 Dialect。名称不存在抛出错误。

csv.list_dialects()
# 返回所有已注册方言的名称。

csv.field_size_limit([ new_limit ] )
# 返回解析器允许的当前最大字段大小。如果给出new_limit,则这将成为新限制。 
2.23类:

class csv.Dialect
# 用来定义一个特定参数的容器类 reader或writer实例。

class csv.excel
# 在excel类定义的Excel生成的通常性质CSV 文件。它以方言名称注册'excel'。

class csv.excel_tab
# 定义Excel生成的制表符分隔的文件的通常的性质。它以方言名称注册'excel-tab'。

class csv.unix_dialect
# 定义UNIX系统上的CSV,即使用生成的文件'\n'作为线路终端机和引用的所有字段。它以方言名称注册'unix'

class csv.Sniffer
# 在Sniffer类用于推导的格式CSV文件。

Sniffer类方法:
sniff(sample, delimiters=None)
# 分析给定的样本并返回Dialect反映找到的参数的子类。
# 如果给出了可选的delimiters参数,则将其解释为包含可能的有效分隔符的字符串。

has_header(sample)
# 分析示例文本(假定为CSV格式), True如果第一行显示为一系列列标题,则返回。 
3.1实例:读取字符串

for row in csv.reader(['one,two,three']):
print(row)# ['one', 'two', 'three'] 
3.2实例:读写 

实例1.1:读取CSV文件的最简单示例:
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:print(row)

实例1.2:相应的最简单的写作示例是:
import csv
with open('some.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(someiterable)

实例2.1:写数据
with open('test_csv_data.csv', 'w', newline='') as f:
writer = csv.writer(f, delimiter=' ',quotechar='|', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['My name is','Tom', 'Bob', 'Jim', 'May'])
writer.writerow(['Color is', 'red', 'yellow green','blue'])

实例2.2:读数据
with open('test_csv_data.csv', newline='') as f:
spamreader = csv.reader(f, delimiter=' ', quotechar='|')
for row in spamreader:
print(', '.join(row))

# My name is, Tom, Bob, Jim, May
# Color is, red, yellow green, blue

实例3.1:写入csv文件

with open('csv_test.csv', 'w',newline='') as f:# 如不指定newline='',有时则每写入一行将有一空行被写入
writer = csv.writer(f)
writer.writerow(['name', 'age', 'tel']) # 写入一行用writerow

data = [('Tom', '25', '1367890900'), ('Jim', '18', '1367890800')]
writer.writerows(data) # 多行用writerows

实例3.2:读取
with open('csv_test.csv', encoding='utf-8') as f:
csv_reader = csv.reader(f)
for row in csv_reader:
print(row)

# ['name', 'age', 'tel']
# ['Tom', '25', '1367890900']
# ['Jim', '18', '1367890800'] 
 3.3字典读写

# 实例1:字典方式写
datas = [{'name': 'Bob', 'age': 23},{'name': 'Jerry', 'age': 44},{'name': 'Tom', 'age': 15} ]

with open('test_csv_data.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, ['name', 'age'])# 标头在这里传入,作为第一行数据
writer.writeheader()
for row in datas:
writer.writerow(row)
# 还可以写入多行
writer.writerows(datas)

# 实例2:字典方式读
import csv
with open('test_csv_data.csv','r') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['name'], row['age'])

# name,age
# Bob,23
# Jerry,44
# Tom,15
# Bob,23
# Jerry,44
# Tom,15 
3.4csv文件格式

# 方法1:定义csv.Dialect的一个子类(如专门的分隔符、字符串引用约定、行结束符等) :

class my_dialect(csv.Dialect):
lineterminator = '\n'
delimiter = ';'
quotechar = '"'

reader = csv. reader (f , diaect=my_dialect)

# 方法2:各个csv方法的参数以关键字的形式提供给c sv.reader :

reader= csv.reader(f, delimiter='|') 
3.5注册新方言: 

csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='') as f:
reader = csv.reader(f, 'unixpwd') 
3.6捕获和报告错误: 

import csv, sys
filename = 'some.csv'
with open(filename, newline='') as f:
reader = csv.reader(f)
try:
for row in reader:
print(row)
except csv.Error as e:
sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e)) 
3.7示例Sniffer: 

with open('test_csv_data.csv', newline='') as f:
dialect = csv.Sniffer().sniff(f.read(1024))
f.seek(0)
reader = csv.reader(f, dialect,delimiter=' ',quotechar='|', quoting=csv.QUOTE_NONE,escapechar='$')
# process CSV file contents here
for i in reader:
print(i)

# ['name is', 'age', 'weight', 'remark']
# ['Tom', '25', '31.2', '$te|st']
# ['Jim', '35', '42.8', '$test$st'] 
3.8实例:dialect 

f=open('test_csv_data.csv', newline='')
spamreader = csv.reader(f, delimiter=' ', quotechar='|')
spamreader.dialect,spamreader.line_num

dialect=spamreader.dialect

dialect.delimiter #分隔字段的单字符字符串 #' '
dialect.doublequote#如何处理字段内的引用符号。如果为True ,则双写 #1
dialect.escapechar #用于对分隔符进行转义的字符串=None禁用 #
dialect.lineterminator #用于写操作的行结束符 # '\r\n'
dialect.quotechar #用于带有特殊字符(如分隔符)的字段的引用符号 #'|'
dialect.quoting #引用约定 # 0
dialect.skipinitialspace#忽略分隔符后面的空白符。默认为False # 0
dialect.strict #如何处理字段内的引用符号 # 0 
3.9实例:- 引用约定 

使用备用格式读取文件
with open('test_csv_data.csv', 'w', newline='') as f:
writer = csv.writer(f, delimiter=' ',quotechar='|', quoting=csv.QUOTE_NONE,escapechar='$')
writer.writerow(['name is','age', 'weight', 'remark'])
writer.writerow(['Tom', 25, 31.2,'$te|st'])
writer.writerow(['Jim', 35, 42.8,'$test$st'])
quoting=csv.QUOTE_ALL,escapechar=None
# 指示writer对象引用所有字段。

# |name is| |age| |weight| |remark|
# |Tom| |25| |31.2| |$te||st|
# |Jim| |35| |42.8| |$test$st|

quoting=csv.QUOTE_MINIMAL,escapechar=None
# 指示writer对象只引用那些包含特殊字符,如字段分隔符,quotechar或任何字符 lineterminator。

# |name is| age weight remark
# Tom 25 31.2 |$te||st|
# Jim 35 42.8 $test$st

quoting=csv.QUOTE_NONNUMERIC,escapechar=None
# 指示writer对象引用所有非数字字段。指示读者将所有非引用字段转换为float类型。

# |name is| |age| |weight| |remark|
# |Tom| 25 31.2 |$te||st|
# |Jim| 35 42.8 |$test$st|

quoting=csv.QUOTE_NONE,escapechar='$'
# 指示writer对象不引用字段。当输出数据中出现当前分隔符时,它前面是当前的escapechar字符。
# 如果未设置escapechar错误抛出;指示reader不对引号字符执行特殊处理。

# name$ is age weight remark
# Tom 25 31.2 $$te$|st
# Jim 35 42.8 $$test$$st 
4.备注 

参数 说明
delimiter  用于分隔字段的单字符字符串。默认为","
lineterminator  用于写操作的行结束符,默认为“'\r\n ' 。读操作将忽略此选项,它能认出跨平台的行结束符
quotechar  用于带有特殊字符(如分隔符)的字段的引用符号。默认为' " '
quoting  引用约定。可选值包括csv.QUOTE _ ALL (引用用所有字段)
  csv.QUOTE_MINIMAL(引用如分隔符之类特殊字符的字段)默认
  csv.QUOTE_NONNUMERIC 
  csv.QUOTE_NON (不引用)
skipinitialspace  忽略分隔符后面的空白符。默认为False
doublequote  如何处理字段内的引用符号。如果为True ,则双写。
escapechar 用于对分隔符进行转义的字符串(如quoting=csv.QUOTE_NONE默认禁用
————————————————
版权声明:本文为CSDN博主「tcy23456」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tcy23456/article/details/85228189

posted @ 2021-03-08 23:43  沈一愣  阅读(622)  评论(0编辑  收藏  举报