csv和xlrd模块

1、csv模块

CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式,用以存储表格数据,包括数字或者字符。

2、namedtuple(具名元组)

因为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义,所以在这里引入了 collections.namedtuple 这个工厂函数,来构造一个带字段名的元组。具名元组的实例和普通元组消耗的内存一样多,因为字段名都被存在对应的类里面。

namedtuple 对象的定义如以下格式:

collections.namedtuple(typename, field_names, verbose=False, rename=False)

返回一个具名元组子类 typename,其中参数的意义如下:
  typename:元组名称
  field_names: 元组中元素的名称
  rename: 如果元素名称中含有 python 的关键字,则必须设置为 rename=True
  verbose: 默认就好

3、数据读取和写入

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

4、xlrd模块

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

你可能感兴趣的:(csv和xlrd模块)