CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式,用以存储表格数据,包括数字或者字符。
因为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义,所以在这里引入了 collections.namedtuple 这个工厂函数,来构造一个带字段名的元组。具名元组的实例和普通元组消耗的内存一样多,因为字段名都被存在对应的类里面。
namedtuple 对象的定义如以下格式:
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一个具名元组子类 typename,其中参数的意义如下:
typename:元组名称
field_names: 元组中元素的名称
rename: 如果元素名称中含有 python 的关键字,则必须设置为 rename=True
verbose: 默认就好
import csv
from collections import namedtuple
def csv_writer():
"""写入csv文件"""
headers = ['编号', '课程', '讲师']
rows = [
(1, 'python', 'Eason'),
(2, 'c#', 'Jack'),
(3, 'Django', 'Mike'),
(4, '.NET', 'John')
]
with open('my_course.csv','w',encoding='utf8', newline='') as f:
writer = csv.writer(f) #可写入列表或元组的对象
writer.writerow(headers) # 写入一行
writer.writerows(rows) # 写入多行
def csv_reader():
"""读取csv文件"""
with open('my_course.csv','r',encoding='utf8') as f:
reader=csv.reader(f) #返回每行是一个列表的迭代器对象
headers=next(reader) #获取文件第一项表头
print(headers)
for row in reader:
print(row)
def csv_read_by_nametuple():
"""读取csv文件并使用具名元组映射列名"""
with open('my_course.csv','r',encoding='utf8') as f:
reader=csv.reader(f)
headers=next(reader)
# 两种方法来给 namedtuple 定义方法名,字符串列表或者空格隔开的字符串
#Row=namedtuple('Row',''.join(headers)) '编号 课程 讲师'
Row=namedtuple('Row',headers) #['编号','课程','讲师']
for r in reader:
row=Row(*r) #解包每行信息
print(row)
print(f'{row.编号}->{row.课程}->{row.讲师}')
if __name__ == '__main__':
csv_writer()
csv_reader()
csv_read_by_nametuple()
=====================运行结果======================
['编号', '课程', '讲师']
['1', 'python', 'Eason']
['2', 'c#', 'Jack']
['3', 'Django', 'Mike']
['4', '.NET', 'John']
Row(编号='1', 课程='python', 讲师='Eason')
1->python->Eason
Row(编号='2', 课程='c#', 讲师='Jack')
2->c#->Jack
Row(编号='3', 课程='Django', 讲师='Mike')
3->Django->Mike
Row(编号='4', 课程='.NET', 讲师='John')
4->.NET->John
除此之外还有字典读取和字典写入csv文件两种方式:
import csv
def csv_writer_by_dict():
"""以字典方式写入csv文件"""
headers = ['ID', 'Title', 'Org', 'Url']
rows = [
{'ID': 1, 'Title': 'Python', 'Org': '优品课堂', 'Url': 'http://uke.cc'},
{'ID': 2, 'Title': 'c#', 'Org': '优品课堂', 'Url': 'http://uke.cc'},
{'ID': 3, 'Title': 'Django', 'Org': '优品课堂', 'Url': 'http://uke.cc'},
dict(ID=4, Title='JAVA', Org='优品课堂', Url='http://uke.cc')
]
with open('my_course.csv','w',encoding='utf8', newline='') as f:
writer = csv.DictWriter(f,headers) #传入文件和表头
writer.writeheader() #写表头
writer.writerows(rows) # 写入多行
def csv_reader_by_dict():
"""以字典方式读取csv文件"""
with open('my_course.csv','r',encoding='utf8') as f:
reader=csv.DictReader(f)
print(next(reader))
for row in reader:
print(row.get('ID',None))
if __name__ == '__main__':
csv_writer_by_dict()
csv_reader_by_dict()
===============运行结果===============
OrderedDict([('ID', '1'), ('Title', 'Python'), ('Org', '优品课堂'), ('Url', 'http://uke.cc')])
2
3
4
Excel文件的读取可以使用xlrd模块,基本的相关命令如下。
import xlrd
def xl_read():
'''excel读取'''
x1 = xlrd.open_workbook('product.xls')
x1.sheet_names() #获取所有sheet名字
x1.nsheets #获取sheet数量
x1.sheets() #获取所有sheet对象
def xl_read_sheet():
'''读取表格'''
x1=xlrd.open_workbook('product.xls')
sheet = x1.sheet_by_index(0) 索引选取表格
sheet = x1.sheet_by_name('product') #名字选取表格
sheet.nrows() #获取总行数
sheet.ncols() #获取总列数
sheet.name() #获取表格名
sheet.row_values(0,2,5) #获取第一行的第2到4列的数据
sheet.col_values(1,5,10) #获取第二列的第5到第9行的数据
sheet.row(0) #获取第一行值数据类型和内容
sheet.row_types(0) #获取第一行数据类型
def xl_read_cell():
'''读取单元数据'''
x1 = xlrd.open_workbook('product.xls')
sheet = x1.sheet_by_name('product') # 名字选取表格
#获取单元格第2行第3列的单元格数据
sheet.cell_value(1,2)
sheet.cell(1,2).value
sheet.row(1)[2].value
#获取单元格类型
sheet.cell_type(1,2)
sheet.cell(1,2).ctype
sheet.row(1)[2].ctype