0 建议学时和要求
4学时
掌握os和os.path模块对文件和文件夹操作的函数
掌握shutil模块对文件和文件夹操作的函数
掌握扩展库openpyxl对Excel文件的操作
1 文件的高级操作
1.1 文件的概念及分类
文本文件
- 文本文件可以使用记事本、gedit、ultraedit等字处理软件直接进行显示和编辑,并且人类能够直接阅读和理解。
- 文本文件由若干文本行组成,包含英文字母、汉字、数字字符串、标点符号等。
- 扩展名为txt、log、ini、c、cpp、py、pyw、html、js、css的文件都属于文本文件。
二进制文件
- 数据库文件、图像文件、可执行文件、动态链接库文件、音频文件、视频文件、Office文档等均属于二进制文件。
- 二进制文件无法用记事本或其他普通字处理软件正常进行编辑,人类也无法直接阅读和理解,需要使用正确的软件进行解码或反序列化之后才能正确地读取、显示、修改或执行。
1.2 上下文管理语句with
在实际开发中,读写文件应优先考虑使用上下文管理语句with。关键字with可以自动管理资源,不论因为什么原因跳出with块,总能保证文件被正确关闭。
with open(filename, mode, encoding) as fp: #通过文件对象fp读写文件内容的语句
【例1】将字符串写入使用UTF8编码格式的文本文件,然后再读取并输出。
s ='1234567\nABCDEFG'
with open('sample.txt', 'w', encoding='utf8') as fp:
fp.write(s)
with open(‘sample.txt', 'r', encoding='utf8') as fp:
s=fp.read()
【例2】遍历并输出文本文件的所有行内容
with open('sample.txt', encoding='utf8') as fp:
for line in fp: #遍历所有行
print(line)
【例3】读取Python安装目录中news.txt文件的内容,然后输出其中第100个字符开始的50个字符。
with open('news.txt', 'r', encoding='utf8') as fp:
content = fp.read() #读取所有内容
print(content[100:150])
【例4】读取文本文件data.txt(文件中每行存放一个整数)中所有整数,按升序排序后再写入文本文件data_new.txt中。
2 文件夹操作
2.1 文件与文件夹操作—os模块
标准库,不需安装
import os.path as path
fileName = 'C:\\Python38\\python.exe'
path.isfile(fileName) #判断是否为文件
# True
path.isdir(fileName) #判断是否为文件夹
# False
path.basename(fileName) #获取路径中最后一部分的名称
# 'python.exe'
path.dirname(fileName) #最后一个路径分隔符前面的部分
# 'C:\\Python38'
path.splitext(fileName) #分隔文件扩展名
# ('C:\\Python38\\python', '.exe')
【例1】遍历指定文件夹的所有子文件夹和文件
from os import listdir
from os.path import join, isfile, isdir
# 遍历文件夹,如果是文件就直接输出如果是文件夹,就输出显示,然后递归遍历该文件夹
def listDirDepthFirst(directory):
for subPath in listdir(directory): #listdir()列出的是相对路径,需要使用join()把父目录连接起来
path = join(directory, subPath)
if isfile(path):
print(path)
elif isdir(path):
print(path)
listDirDepthFirst(path)
listDirDepthFirst("毕业晚会节目院系提交excel")
2.2 shutil模块
标准库,不需安装
【例1】把C:\dir1.txt文件复制到D:\dir2.txt
import shutil
shutil.copyfile('C:\\dir1.txt', 'D:\\dir2.txt')
【例2】使用shutil模块的方法删除文件夹
shutil.rmtree('D:\\unpack')
【例3】使用shutil的copytree()函数复制文件夹,忽略扩展名为py和以“新”开头的文件和子文件夹
from shutil import copytree, ignore_patterns
copytree('C:\\python38\\test', 'D:\\des_test',
ignore=ignore_patterns('*.py', '新*'))
【例4】自动检测U盘插入并把U盘上所有文件复制到本地硬盘上
from shutil import copytree
from psutil import disk_partitions
while True:
sleep(3)
for item in disk_partitions(): #检查所有驱动器
if 'removable' in item.opts: #发现可移动驱动器
driver = item.device
print(‘Found USB disk:’, driver) #输出可移动驱动器符号
break
else:
continue
break
copytree(driver, 'D:\\usbdriver') #复制根目录
print('优盘已复制')
2.3 课后延伸
把文件夹<毕业晚会节目>内的excel文件复制到<汇总>文件夹里
3 Excel操作
3.1 Excel读文件操作
安装
pip install openpyxl -i https://pypi.douban.com/simple
【例1】打开excel并获取单元格数据
from openpyxl import load_workbook
wb = load_workbook('d:\\1.xlsx')
sheet1 =wb['login'] #打开login表
# sheet1=wb.worksheets[0] #打开第一张表
cellA1=sheet1['A1'].value #获取单元格数据
# cellA1=sheet1.cell(1,1).value #获取单元格数据
wb.close()
3.2 Excel写文件操作
【例1】单元格赋值
import openpyxl
wb = openpyxl.Workbook()
sheet1 = wb.worksheets[0]
sheet1.append(['A1', 'B1']) #整行赋值
sheet1.cell(2,2).value=42 #单个单元格赋值
wb.save('1.xlsx')
【例2】有一文件data.xlsx,要求使用openpyxl库读取并输出Excel文件中D列所有单元格内容,如果单元格包含公式则输出公式的计算结果
from openpyxl import load_workbook
#打开Excel文件,获取WorkSheet
ws = load_workbook('data.xlsx', data_only=True).worksheets[0]
#遍历Excel文件所有行,假设下标为3的列中是公式
for row in ws.rows:
print(row[3].value)
【例3】已知有一个文件data.xlsx,要求在第一个工作表中第3列之前插入一列,并保存为data_new.xlsx文件
from openpyxl import load_workbook
ws = load_workbook('data.xlsx').worksheets[0]
ws.insert_cols(3) #在第3列之前插入一列
for index, row in enumerate(ws.rows): #填入数据
if index == 0:
row[2].value = '新字段'
else:
row[2].value = index
wb.save('data_new.xlsx')
3.3 课后延伸
【题1】创建一个名为data.xlsx的excel文件,内部数据为:
【题2】当前文件夹中有若干扩展名为.xlsx的Excel文件,把文件内容合并