三、操作文件与目录
- 文件操作
内置的文件(File) 对象
(1)打开文件
a. 打开/创建指定的文件并创建文件对象
file = open(filename[,mode[,buffering]])
——file:被创建的文件对象。
——filename:要创建或打开文件的文件名称,需要使用单引号或双引号括起来。如果要打开的文件和当前文件在同一个目录下,那么直接写文件名即可,否则需要指定完整路径。
——mode:可选参数,用于指定文件的打开模式,其参数值右表所示。默认的打开模式为只读(即r) 。
——buffering:可选参数,用于指定读写文件的缓冲模式,值为0表达式不缓存;值为1表示缓存;
eg:f = open('song.txt',r)
打开形式
b. 使用with语句打开文件(不需要单独关闭)
with expression as target:
with-body
——expression:用于指定一个表达式, 这里可以是打开文件的open(函数。
——target:用于指定一个变量, 并且将expression的结果保存到该变量中。
——with-body:用于指定with语句体,其中可以是执行with语句后相关的一些操作语句。
eg:
with open('song.txt') as f:
c = f.read()
print(c)
(2)关闭文件
file.close
(3)写入文件
file.write(string)
——string:要写入的字符串
with open('song.txt','a') as f:
f.write('/n-------sweet!')
#/n换行
#r+:在指针的位置写入
(4)读取指定的字符
file.read([size])
(5)按行读取
a. 每次读取一行
file.readline()
b. 读取全部行
file.readlines()
- 目录操作
目录:文件夹,用于分层保存文件。没有直接操作目录的函数或者对象,而是需要使用内置的os和os.path库实现。
(1)导入os库
import os
导入os库之后,也可以使用其子库os.path.
os.path库与目录相关的函数
(2)相对路径与绝对路径
相对路径:如果在当前工作目录下,有一个名称为message.txt的文件,那么在打开这个文件时,就可以直接写上文件名,这时采用的就是相对路径,message.txt文件的实际路径就是当前工作目录。如果在当前工作目录下,有一个子目录demo,并且在该子目录下保存着文件message.txt,那么在打开这个文件时就可以写上"demo/message.txt"
绝对路径是指在使用文件时指定文件的实际路径。它不依赖于当
前工作目录。。在Python中,可以通过os.path模块提供的abspath()
函数获取一个文件的绝对路径。
os.path.abspath(path) ——获取绝对路径
——path为要获取绝对路径的相对路径,可以是文件也可以是目录。
filename.getcwd() ——获取相对路径
输入绝对路径时候为避免单斜杠与文件名中的字母组成转义字符的解决办法:(1)使用双斜杠;(2)在输入路径之前输入r[例如:open(r'data\team\song.txt)]
(3)判断目录是否存在
os.path.exists(path)
(4)创建目录
a. 创建一级目录
一次只能创建一级目录,利用os模块下的mkdir()函数实现,只能创建指定路径下的最后一级目录
os.mkdir(path)
b. 创建多级目录
os.mkdirs(name)
——name:指定要创建的目录。
(5)删除目录
a. 删除的目录需要为空时才起作用。
os.rmdir(path)
b. 删除文件
os.remove(path)
(6)重命名文件和目录
os.rename(src,dst)
- src用于指定要进行重命名的目录或文件;
- dst用于指定重命名后的目录或文件。
同删除文件一样,在进行文件或目录重命名时,如果指定的目录或文件不存在,也将抛出FileNotFoundError异常,所以在进行文件或目录重命名时,也建议先判断文件或目录是否存在,只有存在时才进行重命名操作。
例题:
汇总不同城市的销售数据到总表
#导入库openpyxl
import openpyxl as opl
import os
wb_new = opl.Workbook()
#新创建的工作表wooksheet赋值,active指活动/当前工作表
ws_new = wb_new.active
#设定新工作表的标题行
ws_new.append(['城市','月份','销售额'])
#遍历文件,相对路径
for file in os.listdir('sales'):
print(file)
#读取excel文件中的数据
wb = opl.load_workbook('sales\\'+file)
#data = wb.active.values
#将数据转换为列表对象,元组形式存储,切片形式去除标题行(舍弃0行)
data = list(wb.active.values)[1:]
for row in data:
#print(row)
#设定城市名称
filename = file.split('.')[0]
# print(filename)
#将行设定为只包含一个元素的元组和之前元组的组合,进行加法运算
row = (filename,)+row
#将数据写进新的工作表
ws_new.append(row)
#保存工作表
wb_new.save('result.xlsx')
四、异常处理与程序调试
- 常见异常:
- 异常处理语句
(1)try……excetp语句
try… except语句捕获并处理异常。在使用时,把可能产生异常的代码放在try语句块中,把处理结果放在except语句块中,这样,当try语 句块中的代码出现错误时,就会执行except语句块中的代码,如果try语句块中的代码没有错误,那么except语句块将不会执行。
try:
block1
except [ EXceptionName [as alias] ] :
block2
——block1:表示可能出现错误的代码块。
——ExceptionName [as alias]: 可选参数,用于指定要捕获的异常。其中,ExceptionName表示要捕获的异常名称,如果在其右侧加上as alias, 则表示为当前的异常指定一个别名, 通过该别名,可以记录异常的具体内容。
如果在except后面不指定异常名称,则表示捕获全部异常。
——block2:表示进行异常处理的代码块。在这里可以输出固定的提示信息,也可以通过别名输出异常的具体内容。当程序出错时,输出错误信息后,程序会继续执行。
eg:
try:
fist_num = input('请输入被除数:')
second_num = input('请输入除数:')
result = float(fist_num)/float(second_num)
print('{}除以{}的结果为{:.2f}'.format(fist_num,second_num,result))
except ZeroDivisionError:
print('除数不能为0!')
except ValueError:
print('被除数和除数必须为数字!')
(2)try……except……finally语句
完整的异常处理语句应该包含finally代码块,通常情况下,无论程序中有无异常产生,finally代码块中的代码都会被执行
try:
block1
except [ExceptionName [as aliasl]:
block2
finally:
block3
try… except… finally语句比try…except语句多了一个finally语句,如果程序中有一些在任何情形中都必须执行的代码,那么就可以将它们放在finally代码块中。使用except子句是为 了允许处理异常。无论是否引发了异常,finally子句都可以执行。
- 程序调试
——设置断点:一个断点标记了一个代码行,当Pycharm运行到该 行代码时会将程序暂时挂起。通过单击代码左侧的空白槽可以在对应位置生成断点。
——单步调试:从断点开始分步运行,可以选择进入函数或者不进入函数。
调试(Debug):
F8:逐一判断,显示结果。
F7:遇到函数时,进入函数内部,观察函数内部运算。