第 3 章 不同格式数据的读取与写入 数据往往存在于各种各样的数据库、各种各样的文件中,从外部文件读写 数据是机器学习的前提,是机器学习必不可少的部分。在读写数据时可以对数 据做一定的处理,为接下来使用数据集训练机器模型打好基础。 3.1 使用csv模块读取和写入csv文件 csv(commaseparatedvalues,逗号分隔值)文件是一种用来存储表格数据 (数字和文本)的纯文本格式文件,文档的内容是由“,”分隔的一列列数据构成 的,它可以被导入各种电子表格和数据库中。纯文本意味着该文件是一个字符 序列。在csv文件中,数据“栏”(数据所在列,相当于数据库的字段)以逗号分 隔,可允许程序通过读取文件为数据重新创建正确的栏结构(如把两个数据栏 的数据组合在一起)。csv文件由任意数目的记录组成,记录间以某种换行符分 隔,一行即为数据表的一行;每条记录由字段组成,字段间的分隔符最常见的是 逗号或制表符。可使用Word、记事本、Excel等方式打开csv文件。 创建csv 文件的方法有很多,最常用的方法是用电子表格创建,如 MicrosoftExcel。在MicrosoftExcel中,选择“文件”>“另存为”命令,然后在 “文件类型”下拉选择框中选择“CSV (逗号分隔)(*.csv)”,最后单击“保存”按 钮即创建了一个csv格式的文件。 Python的csv模块提供了多种读取和写入csv格式文件的方法。 本节基于consumer.csv文件,其内容为: 客户年龄,平均每次消费金额,平均消费周期 23,318,10 22,147,13 24,172,17 27,194,67 3.1.1 使用csv.reader()读取csv文件 csv.reader()用来读取csv文件,其语法格式如下: 第3章 不同格式数据的读取与写入 41 csv.reader(csvfile, dialect='excel', **fmtparams) 作用:返回一个reader对象,这个对象是可以迭代的,有一个参数line_num,表示当 前行数。 参数说明如下。 csvfile:可以是文件(file)对象或者列表(list)对象。如果csvfile是文件对象,则要求 该文件以newline="的方式打开。 dialect:编码风格,默认为excel的风格,也就是用逗号分隔。dialect方式也支持自 定义,通过调用register_dialect()方法来注册。 fmtparams:用于指定特定格式,以覆盖dialect中的格式。 【例3-1】 使用reader读取csv文件(csv_reader.py)。 import csv with open('consumer.csv',newline='') as csvfile: spamreader =csv.reader(csvfile) #返回的是迭代类型 for row in spamreader: print(', '.join(row)) #以逗号连接各字段 csvfile.seek(0) #文件指针移动到文件开始 for row in spamreader: print(row) 说明:newline用来指定换行控制方式,可取None、\' n'、\' r'或\' r\n'。读取时,不指定 newline,文件中的\' n'、\' r'或\' r\n'默认被转换为\' n';写入时,不指定newline,若换行符为 各系统默认的换行符('\n'、'\r'或'\r\n')指定为newline='\n',则都替换为'\n';若设定 newline=',不论读或者写,都表示不转换换行符。 将上述程序代码保存在csv_reader.py文件中,在IDLE中运行该程序文件,输出的 结果如下。 客户年龄,平均每次消费金额,平均消费周期 23, 318, 10 22, 147, 13 24, 172, 17 27, 194, 67 ['客户年龄', '平均每次消费金额', '平均消费周期'] ['23', '318', '10'] ['22', '147', '13'] ['24', '172', '17'] ['27', '194', '67'] 3.1.2 使用csv.writer()写入csv文件 csv.writer()用来写入csv文件,其语法格式如下: csv.writer(csvfile, dialect='excel', **fmtparams) 42 Python机器学习原理与实践(微课版) 作用:返回一个writer对象。使用writer对象可将用户的数据写入该writer对象所 对应的文件里。 参数说明如下。 csvfile:可以是文件(file)对象或者列表(list)对象。 dialect:编码风格,默认为excel的风格,也就是用逗号分隔。dialect方式也支持自 定义,通过调用register_dialect()方法来注册。 fmtparams:用于指定特定格式,以覆盖dialect中的格式。 csv.writer()所生成的csv.writer文件对象支持以下写入csv文件的方法。 writerow(row):写入一行数据。 writerows(rows):写入多行数据。 【例3-2】 使用writer写入csv文件(csv_writer.py)。 import csv #写入的数据将覆盖consumer.csv 文件 with open('consumer.csv', 'w', newline='') as csvfile: spamwriter =csv.writer(csvfile) #生成csv.writer 文件对象 spamwriter.writerow(['55','555','55']) #写入一行数据 spamwriter.writerows([('35','355','35'),('18','188','18')]) with open('consumer.csv',newline='') as csvfile: #重新打开文件 spamreader =csv.reader(csvfile) for row in spamreader: #输出用writer 对象的写入方法写入数据后的文件 print(row) csv_ writer.py在IDLE中运行的结果如下: ['55', '555', '55'] ['35', '355', '35'] ['18', '188', '18'] 【例3-3】 使用writer向csv文件追加数据(csv_ writer_add.py)。 import csv with open('consumer.csv', 'a+', newline='') as csvfile: spamwriter =csv.writer(csvfile) spamwriter.writerow(['55','555','55']) spamwriter.writerows([('35','355','35'),('18','188','18')]) with open('consumer.csv',newline='') as csvfile: #重新打开文件 spamreader =csv.reader(csvfile) for row in spamreader: #输出用writer 对象的写入方法写入数据后的文件 print(row) csv_ writer_add.py在IDLE中运行的结果如下: ['客户年龄', '平均每次消费金额', '平均消费周期'] ['23', '318', '10'] 第3章 不同格式数据的读取与写入 43 ['22', '147', '13'] ['24', '172', '17'] ['27', '194', '67'] ['55', '555', '55'] ['35', '355', '35'] ['18', '188', '18'] 3.1.3 使用csv.DictReader()读取csv文件 把一个关系型数据库保存为csv文档,再用Python读取数据或写入新数据,在数据 处理中是很常见的。很多情况下,读取csv数据时,往往先把csv文件中的数据读成字典 的形式,即为读出的每条记录中的数据添加一个说明性的关键字,这样便于理解。为此, csv库提供了能直接将csv文件读取为字典的函数DictReader(),也有相应的将字典写入 csv文件的函数DictWriter()。 csv.DictReader()的语法格式如下: csv.DictReader(csvfile, fieldnames=None, dialect='excel') 作用:DictReader()用于返回一个DictReader对象,该对象的操作方法与reader对 象的操作方法类似,可以将读取的信息映射为字典,其关键字由可选参数fieldnames 指定。参 数说明如下。 csvfile:可以是文件(file)对象或者列表(list)对象。 fieldnames:是一个序列,用于为输出的数据指定字典关键字,如果没有指定,则以第 一行的各字段名作为字典关键字。 dialect:编码风格,默认为excel的风格,也就是用逗号“,”分隔。dialect方式也支持 自定义,通过调用register_dialect()方法注册。 【例3-4】 使用csv.DictReader()读取csv文件(csv_DictReader.py)。 import csv with open('consumer.csv', 'r') as csvfile: dict_reader =csv.DictReader(csvfile) for row in dict_reader: print(row) csv_DictReader.py在IDLE中运行的结果如下: OrderedDict([('客户年龄', '23'), ('平均每次消费金额', '318'), ('平均消费周期', '10')]) OrderedDict([('客户年龄', '22'), ('平均每次消费金额', '147'), ('平均消费周期', '13')]) OrderedDict([('客户年龄', '24'), ('平均每次消费金额', '172'), ('平均消费周期', '17')]) OrderedDict([('客户年龄', '27'), ('平均每次消费金额', '194'), ('平均消费周期', '67')]) 【例3-5】 使用csv.DictReader()读取csv文件,并为输出的数据指定新的字段名 (csv_DictReader1.py)。 44 Python机器学习原理与实践(微课版) import csv print_dict_name=['年龄','消费金额','消费频率'] with open('consumer.csv', 'r') as csvfile: dict_reader =csv.DictReader(csvfile,fieldnames=print_dict_name) for row in dict_reader: print(row) print("\nconsumer.csv 文件内容: ") with open('consumer.csv',newline='') as csvfile: #重新打开文件 spamreader =csv.reader(csvfile) for row in spamreader: print(row) csv_DictReader1.py在IDLE中运行的结果如下: OrderedDict([('年龄', '客户年龄'), ('消费金额', '平均每次消费金额'), ('消费频率', '平均消费周期')]) OrderedDict([('年龄', '23'), ('消费金额', '318'), ('消费频率', '10')]) OrderedDict([('年龄', '22'), ('消费金额', '147'), ('消费频率', '13')]) OrderedDict([('年龄', '24'), ('消费金额', '172'), ('消费频率', '17')]) OrderedDict([('年龄', '27'), ('消费金额', '194'), ('消费频率', '67')]) consumer.csv文件内容: ['客户年龄', '平均每次消费金额', '平均消费周期'] ['23', '318', '10'] ['22', '147', '13'] ['24', '172', '17'] ['27', '194', '67'] 从上述输出结果可以看出,consumer.csv文件中第一行的数据并没发生变化。 3.1.4 使用csv.DictWriter()写入csv文件 如果需要将字典形式的记录数据写入csv文件,则可以使用csv.DictWriter()实现, 其语法格式如下: csv.DictWriter(csvfile, fieldnames, dialect='excel') 作用:DictWriter()用于返回一个DictWriter对象,该对象的操作方法与writer对 象的操作方法类似。参数csvfile、fieldnames和dialect的含义与DictReader()函数中的 参数类似。 【例3-6】 使用csv.DictWriter()写入csv文件(csv_DictWriter.py)。 import csv dict_record =[{'客户年龄': 23, '平均每次消费金额': 318, '平均消费周期': 10}, {'客户 年龄': 22, '平均每次消费金额': 147, '平均消费周期': 13}] keys =['客户年龄','平均每次消费金额','平均消费周期'] 第3章 不同格式数据的读取与写入 45 #在该程序文件所在目录下创建consumer1.csv 文件 with open('consumer1.csv', 'w+',newline='') as csvfile: #文件头以列表的形式传入函数,列表的每个元素表示每一列的标识 dictwriter =csv.DictWriter(csvfile, fieldnames=keys) #若此时直接写入内容,会导致没有数据名,需先执行writeheader()将文件头写入 #writeheader()没有参数,因为在建立dictwriter 时已设定了参数fieldnames dictwriter.writeheader() for item in dict_record: dictwriter.writerow(item) print("以csv.DictReader()方式读取consumer1.csv: ") with open('consumer1.csv', 'r') as csvfile: reader =csv.DictReader(csvfile) for row in reader: print(row) print("\n 以csv.reader()方式读取consumer1.csv: ") with open('consumer1.csv',newline='') as csvfile: #重新打开文件 spamreader =csv.reader(csvfile) for row in spamreader: print(row) csv_ DictWriter.py在IDLE中运行的结果如下: 以csv.DictReader()方式读取consumer1.csv: OrderedDict([('客户年龄', '23'), ('平均每次消费金额', '318'), ('平均消费周期', '10')]) OrderedDict([('客户年龄', '22'), ('平均每次消费金额', '147'), ('平均消费周期', '13')]) 以csv.reader()方式读取consumer1.csv: ['客户年龄', '平均每次消费金额', '平均消费周期'] ['23', '318', '10'] ['22', '147', '13'] 3.2 使用python-docx模块处理Word文档 Python可以利用python-docx模块处理Word文档,处理方式是面向对象的。也就 是说python-docx模块会把Word文档、文档中的段落、段落中的文本内容都看作对象, 对对象进行处理就是对Word文档的内容进行处理。python-docx模块的3种类型对象 如下。 (1)Document对象,表示一个Word文档。 (2)Paragraph对象,表示Word文档中的一个段落。 (3)Paragraph对象的text属性对象,表示段落中的文本内容。 通过“pipinstallpython-docx”进行python-docx库的安装。通过“importdocx”导入 python-docx库。 46 Python机器学习原理与实践(微课版) 3.2.1 创建与保存Word文档 使用docx的Document()可以新建或打开Word文档并返回Document对象,若 Document()中指定了Word文档路径,则是打开文档;若没有指定路径,即Document() 中是空白的,则是新建的Word文档。 用Document对象的save(path)方法保存文档,其中参数path是保存的文件 路径。 【例3-7】 创建与保存Word文档。 from docx import Document test =Document() #创建一个新的Word 文档对象 test.save(r'D:\Python\testWord.docx') #将新建的文档保存为testWord.docx 运行上述程序代码,在D 盘的Python文件夹下会创建一个名为testWord.docx的 文档。 3.2.2 读取Word文档 先创建一个“D:\Python\word.docx”文档,并在其中输入如下内容。 【例3-8】 读取“D:\Python\word.docx”文档。 import docx file=docx.Document(r"D:\Python\word.docx") #创建文档对象 print("段落数:"+str(len(file.paragraphs))) #段落数为9,每个回车隔一段 #输出每一段的内容 for para in file.paragraphs: print(para.text) #输出段落编号及段落内容 for i in range(len(file.paragraphs)): print("第"+str(i)+"段的内容是: "+file.paragraphs[i].text) 运行上述程序代码,得到的输出结果如图3-1所示。 3.2.3 写入Word文档 【例3-9】 向Word文档写入文字。 第3章 不同格式数据的读取与写入 47 图3-1 得到的输出结果 from docx import Document from docx.shared import Pt from docx.shared import Inches from docx.oxml.ns import qn document =Document() #创建文档 document.add_heading('卜算子咏梅',0) #加入0 级标题 document.add_heading('作者: [宋]陆游',1) #加入1 级标题 document.add_heading('诗的正文',1) #加入1 级标题 #插入段落,段落是Word 文档最基本的对象之一 paragraph =document.add_paragraph('',style=None) #给段落追加文字 for x in ['驿外断桥边,寂寞开无主。','已是黄昏独自愁,更著风和雨。','无意苦争春,一任 群芳妒。','零落成泥碾作尘,只有香如故。']: paragraph.add_run(x+'\n',style="Heading 2 Char") #添加图像,此处用到图像"咏梅.png" document.add_picture(r'D:\Python\咏梅.png', width=Inches(5),height = Inches(3)) document.add_heading('【简析】',1) #加入1 级标题 paragraph1 =document.add_paragraph('',style=None) #插入段落 #给段落追加文字和设置字符样式 run1 =paragraph1.add_run('陆游一生酷爱梅花,写有大量歌咏梅花的诗,歌颂梅花傲霜雪,凌 寒风,不畏强暴,不羡富贵的高贵品格。') run1.font.size =Pt(18) #设置字号 #设置中文字体 48 Python机器学习原理与实践(微课版) run1.font.name=u'隶书' r =run1._element r.rPr.rFonts.set(qn('w:eastAsia'), u'隶书') document.add_heading('陆游生平',1) #加入1 级标题 paragraph2 =document.add_paragraph('',style=None) #插入段落 #给段落追加文字 run2 =paragraph2.add_run(u'陆游(1125—1210 年),字务观,号放翁,汉族,越州山阴(今绍 兴)人,南宋文学家、史学家、爱国诗人。') run2.font.size =Pt(16)#设置字号 run2.italic =True #设置斜体 run2.bold =True #设置粗体 document.save('writeWord.docx') #保存文件 运行上述程序代码,得到的writeWord.docx文档的内容如图3-2所示。 图3-2 writeWord.docx文档的内容 3.3 Excel的文件读与写 一个以.xlsx为扩展名的Excel文件打开后叫工作簿workbook。每个工作簿可以包 括多张表格worksheet,正在操作的这张表格被认为是活跃的activesheet。每张表格有 第3章 不同格式数据的读取与写入 49 行和列,行号为1、2、3…,列号为A、B、C…。在某一个特定行和特定列的小格子叫单元格 cell。 Python读写Excel的方式有很多,不同的模块在读写的语法格式上稍有区别,下面 介绍用xlrd和xlwt库进行Excel文件的读与写。首先是安装第三方模块xlrd和xlwt, 输入命令“pipinstallxlrd”和“pipinstallxlwt”进行模块安装。 3.3.1 利用xlrd模块读Excel文件 1.打开工作簿文件 >>>import xlrd #打开工作簿文件2016—2017 总成绩排名.xlsx,其部分内容如图3-3 所示 >>>book =xlrd.open_workbook(r'G:\上课课件\Python 数学建模方法与实践\2016—2017 总成绩排名.xlsx') #创建workbook 对象,即工作簿对象 图3-3 2016—2017总成绩排名.xlsx文件的部分内容 2.获取表格sheet 通过工作簿对象获取表格sheet的常用方法如下。 (1)获取所有sheet名字:book.sheet_names()。 (2)获取sheet数量:book.nsheets。 (3)获取所有sheet对象:book.sheets()。 (4)通过sheet名查找:book.sheet_by_name("test”)。 (5)通过索引查找:book.sheet_by_index(3)。 >>>book.sheet_names() #获取工作簿book 的所有表格的名字 ['Java 技术14', '测试技术14', '软件会计14', '软件开发14', '移动互联网14', 'Java 技 术15', '测试技术15', '软件会计15', '软件开发15', '移动互联网15', 'Java 技术16', '软件测试16', '移动互联网16', '软件开发16'] 50 Python机器学习原理与实践(微课版) >>>book.nsheets #获取工作簿book 的表格数量 14 >>>book.sheet_by_name("测试技术14") #通过sheet 名查找表格 >>>book.sheet_by_index(1) #通过索引查找表格 3.获取表格sheet的汇总数据 >>>sheet1 =book.sheets()[0] #获取第1 个表格,创建表格对象sheet1 表格对象的常用属性如下。 (1)获取sheet名:sheet1.name。 (2)获取总行数:sheet1.nrows。 (3)获取总列数:sheet1.ncols。 >>>sheet1.name #获取sheet 名 'Java 技术14' >>>sheet1.nrows #获取总行数 113 >>>sheet1.ncols #获取总列数 22 4.单元格批量读取 (1)行操作。 . sheet1.row_values(3) #获取表格对象sheet1 第4 行的所有内容,合并单元格 . sheet1.row(3) #获取第4 行各单元格值的类型和内容 . sheet1.row_types(3) #获取第4 行各单元格数据的类型 >>>sheet1.row_values(3) #获取第4 行内容 [2.0, '541413440132', '刘文静', 82.0, 92.0, 70.0, 81.0, 90.0, 89.0, 80.0, 92.0, 91.0, 85.0, 80.0, 80.0, 100.0, 100.0, 3187.0, '', '', '', ''] >>>sheet1.row(3) #获取第4 行各单元格值的类型和内容 [number:2.0, text: ' 541413440132 ', text: ' 刘文静', number: 82. 0, number: 92. 0, number:70.0, number:81.0, number:90.0, number:89.0, number:80.0, number:92.0, number:91. 0, number: 85. 0, number: 80. 0, number: 80. 0, number: 100. 0, number: 100.0, number:3187.0, empty:'', empty:'', empty:'', empty:''] >>>sheet1.row_types(3) #获取第4 行各单元格数据的类型 array('B', [2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0]) 数据类型说明如下。 . 空:0; . 字符串:1; . 数字:2; 第3章 不同格式数据的读取与写入 51 . 日期:3; . 布尔:4; .error:5。 (2)表操作。 . sheet1.row_values(0, 6, 10) #取第1 行,第6~ 10 列(不含第10 列) . sheet1.col_values(0, 0, 5) #取第1 列,第0~ 5 行(不含第5 行) >>>sheet1.row_values(0, 6, 10) ['[1501101]毛泽东思想和中国特色社会主义理论体系概论2', '[1901100]大学生就业指导', '[0414101]计算机组成原理', '[0721200]现代企业管理'] >>>sheet1.col_values(2, 0, 5) #取第3 列,第0~ 5 行(不含第5 行) ['', '', '武彦华', '刘文静', '李贤'] 5.获取单元格值 (1)sheet1.cell_value(2,2):取第3行、第3列的值。 (2)sheet1.cell(2,2).value:取第3行、第3列的值。 (3)sheet1.row(2)[2].value:取第3行、第3列的值。 >>>sheet1.cell_value(2, 2) '武彦华' >>>sheet1.cell(2, 2).value '武彦华' >>>sheet1.row(2)[2].value '武彦华' 3.3.2 利用xlwt模块写Excel文件 目前,xlwt支持xls格式的Excel,还不支持xlsx格式的Excel。 利用xlwt模块写Excel文件的过程如下。 (1)新建Excel工作簿。 (2)添加sheet工作表。 (3)写入内容。 (4)保存文件。 >>>import xlwt #创建一个工作簿workbook 并设置编码 >>>workbook =xlwt.Workbook(encoding ='utf-8') #在工作簿中添加新的工作表,若不给名字,就是默认的名字,这里的名字是chengji >>>worksheet =workbook.add_sheet('chengji') >>>worksheet.write(0,0,'Student ID') #向第一个单元格写入Student ID #上面的语句是按照独立的单个单元格写入的 #下面按照行写入,因为有的时候需要按照行写入 >>>row2=worksheet.row(1) #在第2 行创建一个行对象 52 Python机器学习原理与实践(微课版) >>>row2.write(0,'541513440106') #向第2 行第1 列写入"541513440106" #保存工作簿workbook,会在当前目录生成一个Students.xls 文件 >>>workbook.save('Students.xls') 3.4 pandas读写不同格式的数据 从外部文件读写数据是数据分析处理的前提,是数据处理必不可少的部分。在读写 数据时可以对数据做一定的处理,为接下来对数据做进一步分析打好基础。pandas常用 的读写不同格式文件的函数见表3-1。 表3-1 pandas常用的读写不同格式文件的函数 读取函数写入函数描 述 read_csv() to_csv() 读写csv格式的数据 read_table() 读取普通分隔符分割的数据 read_excel() to_excel() 读写excel格式的数据 read_json() to_json() 读写json格式的数据 read_html() to_html() 读写html格式的数据 read_sql() to_sql() 读写数据库中的数据 下面主要介绍常见的csv文件的读写、txt文件的读取、Excel文件的读写。 3.4.1 读写csv文件 1.读取csv文件中的数据 在介绍读写csv格式的文件之前,先在Python的工作目录下创建一个短小的csv文 件,将其保存为student.csv。文件内容如下。 Name,Math,Physics,Chemistry WangLi,93,88,90 ZhangHua,97,86,92 LiMing,84,72,77 ZhouBin,97,94,80 这个文件以逗号作为分隔符,可使用pandas的read_csv()函数读取它的内容,返回 DataFrame格式的文件。 >>>csvframe =pd.read_csv('student.csv') #从csv 中读取数据 >>>type(csvframe) >>>csvframe 第3章 不同格式数据的读取与写入 53 Name Math Physics Chemistry 0 WangLi 93 88 90 1 ZhangHua 97 86 92 2 LiMing 84 72 77 3 ZhouBin 97 94 80 csv文件中的数据为列表数据,位于不同列的元素用逗号隔开,csv文件被视作文本 文件,也可以使用pandas的read_table()函数读取,但需要指定分隔符。 >>>pd.read_table('student.csv',sep=',') Name Math Physics Chemistry 0 WangLi 93 88 90 1 ZhangHua 97 86 92 2 LiMing 84 72 77 3 ZhouBin 97 94 80 pd.read_csv()函数的语法格式如下。 pd.read_csv(filepath_or_buffer, sep= ',', header= 'infer', names= None, index_ col=None, usecols=None) 作用:读取csv(逗号分割)文件到DataFrame对象。 参数说明如下。 filepath_or_buffer:拟要读取的文件的路径,可以是本地文件,也可以是http、ftp、s3 文件。 sep:其类型是str,默认为',',用来指定分隔符。如果不指定sep参数,则会尝试使用 逗号分隔。csv文件中的分隔符一般为逗号分隔符。 header:其类型中int或int型列表指定第几行作为列名,默认为0(第1行)。如果第 1行不是列名,是内容,可以设置header=None,以便不把第1行当作列名。header参数 可以是一个列表,例如[0,2],这个列表表示将文件中的这些行作为列标题(这样,每一列 将有多个标题),介于中间的行将被忽略(例如本例中的第2行;本例数据中,行号为0、2 的行将被作为多级标题出现,行号为1的行将被丢弃,dataframe的数据从行号为3的行 开始)。 names:用于结果的列名列表,对各列重命名,即添加表头。如果数据有表头,但想用 新的表头,可以设置header=0、names=[a' ',b' ']实现新表头的定制。 index_col:其类型为int或序列类型,默认为None,用作行索引的列编号或者列名, 可使用index_col=[0,1]指定文件中的第1和2列为行索引。 usecols:其类型是列表,默认None,返回一个数据子集,即选取某几列,不读取整个 文件的内容,有助于加快速度和降低内存,如usecols=[1,2]或usercols=['a','b']。为# 指定csv文件中的行号为0、2的行为列标题 >>>csvframe =pd.read_csv('student.csv',header=[0,2]) >>>csvframe 54 Python机器学习原理与实践(微课版) Name Math Physics Chemistry ZhangHua 97 86 92 0 LiMing 84 72 77 1 ZhouBin 97 94 80 >>>pd.read_csv('student.csv',usecols=[1,2]) #读取第2 列和第3 列 Math Physics 0 93 88 1 97 86 2 84 72 3 97 94 #设置header=0, names=['name','maths','physical','chemistry']实现表头定制 >>> pd.read_csv('student.csv',header= 0, names= ['name', 'maths', 'physical', 'chemistry']) name maths physical chemistry 0 WangLi 93 88 90 1 ZhangHua 97 86 92 2 LiMing 84 72 77 3 ZhouBin 97 94 80 >>>pd.read_csv('student.csv',index_col=[0,1]) #指定前两列作为行索引 Physics Chemistry Name Math WangLi 93 88 90 ZhangHua 97 86 92 LiMing 84 72 77 ZhouBin 97 94 80 2.向csv文件写入数据 把DataFrame对象中的数据写入csv文件,要用到to_csv()函数,其语法格式如下。 DataFrame.to_csv(path_or_buf=None, sep=',', na_rep= '',columns= None, header= True, index=True) 作用:以逗号为分隔符将DataFrame对象中的数据写入csv文件中。 参数说明如下。 filepath_or_buffer:拟要写入的文件的路径或对象。 sep:默认字符为',',用来指定输出文件的字段分隔符。 na_rep:字符串,默认为",缺失数据表示,即把空字段替换为na_rep所指定的值。 columns:指定要写入文件的列。 header:是否保存列名,默认为True,保存。如果给定字符串列表,则将其作为列名 的别名。 index:是否保存行索引,默认为True,保存。 >>>import pandas as pd 第3章 不同格式数据的读取与写入 55 >>>date_range =pd.date_range(start="20180801", periods=4) >>> df= pd.DataFrame({'book':[12,13,15,22],'box':[3,8,13,18],'pen': [5,7,12, 15]},index=date_range) >>>df book box pen 2018-08-01 12 3 5 2018-08-02 13 8 7 2018-08-03 15 13 12 2018-08-04 22 18 15 >>>df.to_csv('bbp.csv') #把df 中的数据写入默认工作目录下的bbp.csv 文件 生成的bbp.csv文件的内容如下: ,book,box,pen 2018-08-01,12,3,5 2018-08-02,13,8,7 2018-08-03,15,13,12 2018-08-04,22,18,15 由上述例子可知,把df中的数据写入文件时,行索引和列名称连同数据一起写入,使 用index和header选项,把它们的值设置为False,可取消这一默认行为。 >>>df.to_csv('bbp1.csv',index=False,header=False) 生成的bbp1.csv文件的内容如下: 12,3,5 13,8,7 15,13,12 22,18,15 #写入时,为行索引指定列标签名 >>>df.to_csv("bbp2.csv",index_label="index_label") bbp2.csv文件内容: index_label,book,box,pen 2018-08-01,12,3,5 2018-08-02,13,8,7 2018-08-03,15,13,12 2018-08-04,22,18,15 3.4.2 读取txt文件 txt文件是一种常见的文本文件,可以把一些数据保存在txt文件里,用的时候再读 取出来。pandas的函数read_table()可读取txt文件。 pd.read_table函数的语法格式如下。 pandas.read_table(filepath_or_buffer, sep= '\t', header= 'infer', names= None, 56 Python机器学习原理与实践(微课版) index_col=None, skiprows=None, nrows=None, delim_whitespace=False) 作用:读取以\' t'分隔的文件,返回DataFrame对象。 参数说明如下。 sep:其类型是str,用来指定分隔符,默认为制表符,可以是正则表达式。 index_col:指定行索引。 skiprows:用来指定读取时要排除的行。 nrows:从文件中要读取的行数。 delim_whitespace:delim_whitespace=True表示用空格分隔每行。 首先在工作目录下创建名为1.txt的文本文件,其内容如下: C Python Java 1 4 5 3 3 4 4 2 3 2 1 1 >>>pd.read_table('1.txt') #读取1.txt 文本文件 C Python Java 0 1 4 5 1 3 3 4 2 4 2 3 3 2 1 1 从上面的读取结果可以看出,文件读取后所显示的数据不整齐。读取文本文件时可 以通过用sep参数指定正则表达式来匹配空格或制表符,即用通配符“\s*”,其中“\s”匹 配空格或制表符,星号“*”表示这些字符可能有多个。 >>>pd.read_table('1.txt',sep='\s*') C Python Java 0 1 4 5 1 3 3 4 2 4 2 3 3 2 1 1 如上所示,得到了整齐的DataFrame对象,所有元素均处在和列索引对应的位 置上。 当文件较大时,可以一次读取文件的一部分,这时须明确指明要读取的行号,要用到 nrows和skiprows参数选项,skiprows指定读取时要排除的行,nrows指定从起始行开 始向后读取多少行。 >>>pd.read_table('1.txt',sep='\s*',skiprows=[1],nrows=2) C Python Java 0 3 3 4 1 4 2 3 第3章 不同格式数据的读取与写入 57 在接下来这个例子中,2.txt文件中数字和字母杂糅在一起,需要从中抽取数字部分。 2.txt文件的内容如下: 0BEGIN11NEXT22A32 1BEGIN12NEXT23A33 2BEGIN13NEXT23A34 2.txt文件显然没有表头,用read_table读取时需要将header选项设置为None。 >>>pd.read_table('2.txt',sep='\D*',header=None) 0 1 2 3 0 0 11 22 32 1 1 12 23 33 2 2 13 23 34 3.4.3 读写Excel文件 在数据分析处理中,用Excel文件存放列表形式的数据也非常常见,为此pandas 提供了read_excel()函数来读取Excel文件,用to_excel()函数向Excel文件写入 数据。 1.读取Excel文件中的数据 pandas.read_excel()函数的语法格式如下。 pandas.read _excel(io, sheet _name = 0, header = 0, names = None, index _col = None, usecols=None,skiprows=None,skip_footer=0) 作用:读取Excel文件中的数据,返回一个DataFrame对象。 参数说明如下。 io:Excel文件路径,是一个字符串。 sheet_name:返回指定的sheet(表),如果将sheet_name指定为None,则返回全表; 如果需要返回多个表,可以将sheet_name指定为一个列表,例如[s' heet1',s' heet2'];可以 根据sheet的名字字符串或索引指定所要选取的sheet,例如[0,1,'Sheet5']将返回第一、 第二和第五个表;默认返回第一个表。 header:指定作为列名的行,默认为0,即取第1行,数据为列名行以下的数据;若数 据不含列名,则设定header= None。 names:指定所生成的DataFrame对象的列的名字,传入一个list数据。 index_col:指定某列为行索引。 usecols:通过名字或索引值读取指定的列。 skiprows:省略指定行数的数据。 skip_footer:int,默认值为0,读取数据时省略最后的skip_footer行。 首先在工作目录下创建名为chengji.xlsx的Excel文件,Sheet1的内容见表3-2。 58 Python机器学习原理与实践(微课版) 表3-2 Sheet1的内容 Sheet2的内容见表3-3。 表3-3 Sheet2的内容 接下来通过pandas的read_excel()方法读取chengji.xlsx文件。 >>>pd.read_excel('chengji.xlsx') Student ID name C database oracle Java 0 541513440106 ding 77 80 95 91 1 541513440242 yan 83 90 93 90 2 541513440107 feng 85 90 92 91 3 541513440230 wang 86 80 86 91 4 541513440153 zhang 76 90 90 92 5 541513440235 lu 69 90 83 92 6 541513440224 men 79 90 86 90 7 541513440236 fei 73 80 85 89 8 541513440210 han 80 80 93 88 #将chengji.xlsx 的列名作为所生成的DataFrame 对象的第1 行数据,并重新生成索引 >>>pd.read_excel('chengji.xlsx',header=None) 0 1 2 3 4 0 Student ID name C database oracle 1 541513440106 ding 77 80 95 2 541513440242 yan 83 90 93 3 541513440107 feng 85 90 92 4 541513440230 wang 86 80 86 5 541513440153 zhang 76 90 90 第3章 不同格式数据的读取与写入 59 6 541513440235 lu 69 90 7 541513440224 men 79 90 86 8 541513440236 fei 73 80 85 9 541513440210 han 80 80 93 #skiprows 指定读取数据时要忽略的行,这里忽略第1、2、3 行 >>>pd.read_excel('chengji.xlsx',skiprows =[1,2,3]) Student ID name C database oracle Java 0 541513440230 wang 86 80 86 91 1 541513440153 zhang 76 90 90 92 2 541513440235 lu 69 90 83 92 3 541513440224 men 79 90 86 90 4 541513440236 fei 73 80 85 89 5 541513440210 han 80 80 93 88 #skip_footer=4,表示读取数据时忽略最后4 行 >>>pd.read_excel('chengji.xlsx',skip_footer=4) Student ID name C database oracle Java 0 541513440106 ding 77 80 95 91 1 541513440242 yan 83 90 93 90 2 541513440107 feng 85 90 92 91 3 541513440230 wang 86 80 86 91 4 541513440153 zhang 76 90 90 92 #index_col="Student ID"表示指定Student ID 为行索引 >>>pd.read_excel('chengji.xlsx',skip_footer=4,index_col="Student ID") name C database oracle Java Student ID 541513440106 ding 77 80 95 91 541513440242 yan 83 90 93 90 541513440107 feng 85 90 92 91 541513440230 wang 86 80 86 91 541513440153 zhang 76 90 90 92 #names 参数用来重新命名列名称 >>>pd.read_excel('chengji.xlsx',skip_footer= 5,names= ["a","b","c","d","e", "f"]) a b c d e f 0 541513440106 ding 77 80 95 91 1 541513440242 yan 83 90 93 90 2 541513440107 feng 85 90 92 91 3 541513440230 wang 86 80 86 91 #sheet_name=[0,1]表示同时读取Sheet1 和Sheet2 >>>pd.read_excel('chengji.xlsx',skip_footer=5,sheet_name=[0,1])