大数据的Python基础课件第9章文件与文件夹操作.pptx
《大数据的Python基础课件第9章文件与文件夹操作.pptx》由会员分享,可在线阅读,更多相关《大数据的Python基础课件第9章文件与文件夹操作.pptx(59页珍藏版)》请在三一办公上搜索。
1、第9章 文件与文件夹操作,1,本章学习目标,理解文本文件和二进制文件的概念熟练掌握内置函数open()的用法理解不同打开模式的区别熟练掌握文件对象的方法熟练掌握关键字with的用法了解json模块读写JSON格式文件的用法了解csv模块读写CSV格式文件的用法理解pickle和struct模块读写二进制文件的原理熟练掌握os和os.path模块对文件和文件夹操作的函数了解shutil模块对文件和文件夹操作的函数熟练掌握扩展库python-docx对Word文件的操作熟练掌握扩展库openpyxl对Excel文件的操作,2,9.1 文件的概念及分类,(1)文本文件文本文件可以使用记事本、gedi
2、t、ultraedit等字处理软件直接进行显示和编辑,并且人类能够直接阅读和理解。文本文件由若干文本行组成,包含英文字母、汉字、数字字符串、标点符号等。扩展名为txt、log、ini、c、cpp、py、pyw、html、js、css的文件都属于文本文件。(2)二进制文件数据库文件、图像文件、可执行文件、动态链接库文件、音频文件、视频文件、Office文档等均属于二进制文件。二进制文件无法用记事本或其他普通字处理软件正常进行编辑,人类也无法直接阅读和理解,需要使用正确的软件进行解码或反序列化之后才能正确地读取、显示、修改或执行。,3,9.2 文件操作基本知识,操作文件内容一般需要三步:首先打开文
3、件并创建文件对象,然后通过该文件对象对文件内容进行读取、写入、删除、修改等操作,最后关闭并保存文件内容。,4,9.2.1 内置函数open(),open(file, mode=r, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)参数file指定要操作的文件名称,如果该文件不在当前目录中,建议使用绝对路径,确保从当前工作文件夹出发可以访问到该文件。为了减少路径中分隔符“”符号的输入,可以使用原始字符串。参数mode(取值范围见表9-1)指定打开文件后的处理方式,例如“只读”、“只
4、写”、“读写”、“追加”、“二进制读”、“二进制写”等等,默认为“文本只读模式”。参数encoding指定对文本进行编码和解码的方式,只适用于文本模式,可以使用Python支持的任何格式,如GBK、UTF-8、CP936等。,5,9.2.1 内置函数open(),如果执行正常,open()函数返回1个文件对象,通过该文件对象可以对文件进行读写操作。如果指定文件不存在、访问权限不够、磁盘空间不够或其他原因导致创建文件对象失败则抛出异常。当对文件内容操作完以后,一定要关闭文件对象,这样才能保证所做的任何修改都确实被保存到文件中。然而,即使我们写了关闭文件的代码,也无法保证文件一定能够正常关闭。例如
5、,如果在打开文件之后和关闭文件之前发生了错误导致程序崩溃,这时文件就无法正常关闭。,6,9.2.1 内置函数open(),7,9.2.2 文件对象常用方法,8,9.2.3 上下文管理语句with,在实际开发中,读写文件应优先考虑使用上下文管理语句with。关键字with可以自动管理资源,不论因为什么原因跳出with块,总能保证文件被正确关闭。除了用于文件操作,with关键字还可以用于数据库连接、网络连接或类似场合。用于文件内容读写时,with语句的语法形式如下:with open(filename, mode, encoding) as fp: #这里写通过文件对象fp读写文件内容的语句,9,
6、9.3 文本文件内容操作案例,例9-1 将字符串写入使用UTF8编码格式的文本文件,然后再读取并输出。s = Hello worldn文本文件的读取方法n文本文件的写入方法nwith open(sample.txt, w, encoding=utf8) as fp: fp.write(s)with open(sample.txt, encoding=utf8) as fp: print(fp.read(),10,9.3 文本文件内容操作案例,例9-2 遍历并输出文本文件的所有行内容。with open(sample.txt) as fp: #假设文件采用CP936编码 for line in
7、fp: #文本文件对象可以直接迭代 print(line),11,9.3 文本文件内容操作案例,例9-3 把列表中若干中英文混合的字符串写入文本文件,并在每行最后加上以井号开头的行号,要求所有行的井号垂直对齐。text = Readability counts., 老龙恼怒闹老农,老农恼怒闹老龙。农怒龙恼农更怒,龙恼农怒龙怕农。, 人生苦短,我用Python, Python程序设计实验指导书,Python可以这样学 Python程序设计开发宝典,玩转Python轻松过二级, 樱桃,cherrylongestLine = max(text, key=lambda s:len(s.encode(g
8、bk)maxLength = len(longestLine.encode(gbk)with open(result.txt, w) as fp: for index, line in enumerate(text): fp.write(line+ *(maxLength-len(line.encode(gbk) + #n.format(index),12,9.3 文本文件内容操作案例,例9-4 读取Python安装目录中news.txt文件的内容,然后输出其中第100个字符开始的50个字符。with open(news.txt, r, encoding=utf8) as fp: conten
9、t = fp.read()print(content100:150),13,9.3 文本文件内容操作案例,例9-5 读取文本文件data.txt(文件中每行存放一个整数)中所有整数,按升序排序后再写入文本文件data_asc.txt中。with open(data.txt) as fp: data = fp.readlines()data.sort(key=int)with open(data_new.txt, w) as fp: fp.writelines(data),14,9.4 JSON文件操作, import json json.dumps(a,b,c) #序列化列表对象a, b, c
10、 json.loads(_) #反序列化,还原对象a, b, c json.dumps(a:1, b:2, c:3) #序列化字典对象a: 1, b: 2, c: 3 json.loads(_)a: 1, b: 2, c: 3 json.dumps(1,2,3,4: 5, 6: 7)1, 2, 3, 4: 5, 6: 7#指定分隔符,可以压缩存储,注意和上面结果的区别 json.dumps(1,2,3,4:5, 6:7, separators=(, :)1,2,3,4:5,6:7 json.loads(_)1, 2, 3, 4: 5, 6: 7 json.dumps(山东烟台) #序列化中文字
11、符串u5c71u4e1cu70dfu53f0 json.loads(_)山东烟台,15,9.4 JSON文件操作, s = 董付国,系列图书:Python程序设计基础(第2版)、Python程序设计(第2版)、Python可以这样学、Python程序设计开发宝典、中学生可以这样学Python、玩转Python轻松过二级、Python程序设计基础与应用、Python程序设计实验指导书、Python编程基础与案例集锦(中学版) with open(test.txt, w) as fp: #将内容序列化并写入文本文件 json.dump(s, fp) with open(test.txt) as f
12、p: #读取文件内容并反序列化 print(json.load(fp)董付国,系列图书:Python程序设计基础(第2版)、Python程序设计(第2版)、Python可以这样学、Python程序设计开发宝典、中学生可以这样学Python、玩转Python轻松过二级、Python程序设计基础与应用、Python程序设计实验指导书、Python编程基础与案例集锦(中学版),16,9.5 CSV文件操作,例9-6 生成数据模拟饭店营业额,并写入CSV文件。import csvimport randomimport datetimefn = data.csv#使用参数newline=使得不会插入空行
13、with open(fn, w, newline=) as fp: #创建csv文件写入对象 wr = csv.writer(fp) #写入表头 wr.writerow(日期, 销量) #把今天作为模拟数据的第一天 startDate = datetime.date.today() #生成30个模拟数据,可以根据需要进行调整 for i in range(1, 30): #生成一个模拟数据,写入csv文件 amount = 300 + i*5 + random.randrange(100) wr.writerow(str(startDate), amount) #下一天 startDate =
14、 startDate + datetime.timedelta(days=1),17,9.6 二进制文件操作,对于二进制文件,不能使用记事本或其他文本编辑软件直接进行正常读写,也不能通过Python的文件对象直接读取和理解二进制文件的内容。必须正确理解二进制文件结构和序列化规则,然后设计正确的反序列化规则,才能准确地理解二进制文件内容。,18,9.6.1 使用pickle模块读写二进制文件,例9-7 使用pickle模块把各类Python对象序列化并写入二进制文件。import pickle#实际要写入的数据#有整数、实数、字符串、列表、元组、集合、字典和自定义对象i = 13000000a
15、= 99.056s = 中国人民 123abclst = 1, 2, 3, 4, 5, 6, 7, 8, 9tu = (-5, 10, 8)coll = 4, 5, 6dic = a:apple, b:banana, g:grape, o:orange,19,9.6.1 使用pickle模块读写二进制文件,#自定义类的对象class Test: def _init_(self, value): self.value = value def _str_(self): return str(self.value)t = Test(3)#把所有要写入的数据放入一个元组,以便编写循环代码data =
16、(i, a, s, lst, tu, coll, dic, t),20,9.6.1 使用pickle模块读写二进制文件,#wb表示打开文件用来写入二进制数据with open(sample_pickle.dat, wb) as f: try: pickle.dump(len(data), f) #要序列化的对象个数 for item in data: pickle.dump(item, f) #序列化数据并写入文件 except: print(写文件异常),21,9.6.1 使用pickle模块读写二进制文件,例9-8 使用pickle模块读取上例中二进制文件的内容。import pickle
17、with open(sample_pickle.dat, rb) as f: n = pickle.load(f) #读出文件中的数据个数 for i in range(n): x = pickle.load(f) #读取并反序列化每个数据 print(x),22,9.6.2 使用struct模块读写二进制文件,例9-9 使用struct模块写入二进制文件。import structn = 99 * 9x = 3.14e15b = Trues = 人生苦短,我用Python。#序列化,q表示长整数,d表示双精度实数,?表示逻辑值#得到的字节串sn长度为17,其中整数和实数各占8个字节,逻辑值占
18、1个字节sn = struct.pack(qd?, n, x, b)with open(sample_struct.dat, wb) as f: f.write(sn) #字符串方法encode()默认使用UTF8编码 #字符串s需要编码为字节串(长度为22)再写入文件 f.write(s.encode(gbk),23,9.6.2 使用struct模块读写二进制文件,例9-10 使用struct模块读取上例中二进制文件的内容。with open(sample_struct.dat, rb) as f: sn = f.read(17) n, x, b1 = struct.unpack(qd?,
19、sn) #使用指定格式反序列化 print(n=,n, x=,x, b1=,b1) s = f.read(22).decode(gbk) print(s=, s),24,9.7 文件与文件夹操作9.7.1 os模块,25,9.7.2 os.path模块,26,9.7.2 os.path模块, import os.path as path fileName = rC:Python37python.exe path.isfile(fileName) #判断是否为文件True path.isdir(fileName) #判断是否为文件夹False path.getsize(fileName) #获取
20、文件大小,单位为字节99992 path.basename(fileName) #获取路径中最后一部分的名称python.exe path.dirname(fileName) #最后一个路径分隔符前面的部分C:Python37 path.splitext(fileName) #分隔文件扩展名(C:Python37python, .exe),27,9.7.2 os.path模块, import os os.getcwd()C:Python37 path.join(os.getcwd(), pythonw.exe) #连接多个路径C:Python37pythonw.exe import time
21、path.getctime(fileName) #获取文件创建时间1530046898.0 time.strftime(%Y-%m-%d %H:%M:%S, #转换时间格式 time.localtime(path.getctime(fileName)2018-06-27 05:01:38,28,9.7.2 os.path模块,例9-11 使用递归法遍历指定文件夹及其子文件夹中的所有子文件夹和文件。from os import listdirfrom os.path import join, isfile, isdirdef listDirDepthFirst(directory): #遍历文件
22、夹,如果是文件就直接输出 #如果是文件夹,就输出显示,然后递归遍历该文件夹 for subPath in listdir(directory): #listdir()列出的是相对路径,需要使用join()把父目录连接起来 path = join(directory, subPath) if isfile(path): print(path) elif isdir(path): print(path) listDirDepthFirst(path),29,9.7.3 shutil模块,30,9.7.3 shutil模块,(1)下面的代码把C:dir1.txt文件复制到D:dir2.txt。 im
23、port shutil shutil.copyfile(C:dir1.txt, D:dir2.txt)(2)下面的代码把C:Python36Dlls文件夹以及该文件夹中所有文件压缩至D:a.zip文件: shutil.make_archive(D:a, zip, C:Python36, Dlls)D:a.zip(3)下面的代码把刚压缩得到的文件D:a.zip解压缩至D:a_unpack文件夹: shutil.unpack_archive(D:a.zip, D:a_unpack),31,9.7.3 shutil模块,(4)下面的代码使用shutil模块的方法删除刚刚解压缩得到的文件夹: shut
24、il.rmtree(D:a_unpack)(5)下面的代码使用shutil的copytree()函数递归复制文件夹,忽略扩展名为pyc的文件和以“新”开头的文件和子文件夹: from shutil import copytree, ignore_patterns copytree(C:python36test, D:des_test, ignore=ignore_patterns(*.pyc, 新*),32,9.7.3 shutil模块,例9-12 自动检测U盘插入并把U盘上所有文件复制到本地硬盘上。from shutil import copytreefrom time import sle
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 Python 基础 课件 文件 文件夹 操作
链接地址:https://www.31ppt.com/p-1748801.html