文件操作,异常处理
读文件: open(path/filename,'rt')----->返回值:stream(管道) container=stream.read()------>读取管道中内容 注:如果传递的path/filename有误,则会报错:FileNotFoundError 如果是图片,不能使用默认的读取方式,需要mode=’rb‘ 总结:read()
stream = open(r'E:\p1\aa.txt') # mode默认是read.绝对路径
container = stream.read() # read()
print(container)
readline():每次读取一行
stream = open(r'E:\p1\aa.txt')
line = stream.readline()#读取一行
print(line)
# 读取所有内容
while True:
line=stream.readline()
print(line)
if not line:
break
readlines():读取所有行,保存到列表中
stream = open(r'E:\p1\aa.txt')
lines=stream.readlines()#['feskhsj\n', 'hfshfhs']将内容保存到列表中
print(lines)
# 将列表中内容打印出
lines=stream.readlines()
print(lines)
for i in lines:
print(i)
readable():判断是否可读
stream = open(r'E:\p1\aa.txt')
result = stream.readable() # 方法后面加able,判断是否,返回值为bool类型
print(result)
写文件 mode='w'-->表示写操作,会将原有内容清空 方法: write(内容):每次都会将原来的内容清洗,然后写当前的内容
stream = open(r'E:\p1\aa.txt', 'w')
# '''...'''保留格式输出
s = '''
你好!
欢迎来到赌场....
邀请人:高静
'''
result = stream.write(s) # 写操作:
stream.write('张三')
stream.writelines(['\nhello world\n', '快乐星球\n'])
# ...只要管道不关闭,可以无限添加
stream.close() # 内存将通道回收,释放资源
writelines(iterable):没有换行的效果,需自加 mode='a'---->追加,不会清空当前内容。append
stream = open(r'E:\p1\aa.txt', 'a')
s = '这段内容是在现有内容上添加上去的。。。。'
result = stream.write(s)
stream.close()
文件的复制
原文件:E:\p1\人像图.jfif
目标文件:E:\p2\人像图.jfif
with 结合open使用,可以帮我们自动释放资源
with open(r'E:\p1\人像图.jfif', 'rb') as stream:
container = stream.read() # 读取文件内容
with open(r'E:\p2\人像图.jfif', 'wb') as wstream:
wstream.write(container)
print('文件复制成功!')
stream.close()
os模块:
os.path:常用函数 dirname():获取指定文件目录 join():可拼接多个 split():分割(文件目录,文件名) splittext():分割(文件目录\文件名,文件的扩展名) getsize():获取文件大小 isabs():判断是否是绝对路径 isfile():判断是否是文件 isdir():判断是否是文件夹
os.path.dirname(__file__):获取当前文件所在的文件目录,(绝对路径)
import os
print(os.path.dirname(__file__)) # 获取当前文件所在的文件夹的路径,(绝对路径)
#获取当前文件所在文件夹,类似于os.path.dirname(__file__)
path = os.getcwd()
print(path)
os.path.abspath('aa.txt'):通过相对路径得到绝对路径
import os
path = os.path.abspath('aa.txt')
print(path)
os.path.abspath(__file__):获取当前文件的绝对路径
import os
path = os.path.abspath(__file__)
print(path)
os.path.split(path):获取文件名
import os
# 获取当前文件的文件名
path = r'D:\p\code\aa\文件操作.py'
#获取文件名
result = os.path.split(path) # 结果: ('D:\\p\\venv\\Scripts\\python.exe D:\\p\\code\\aa', '文件操作.py')
print(result[1])
filename = path[path.rfind('\\' + 1):]#获取名字
print(filename)
os.path.splitext(path):分割文件与扩展名
import os
path = r'D:\p\code\aa\文件操作.py'
result = os.path.splitext(path) # ('D:\\p\\code\\aa\\文件操作', '.py')
print(result[1])
os.path.getsize(path):获取文件的大小,单位字节
import os
path = r'D:\p\code\aa\文件操作.py'
size = os.path.getsize(path)
print(size)
将p1\人像图.jfif保存到当前文件所在的目录下
import os
with open(r'E:\p1\人像图.jfif', 'rb') as stream:
container = stream.read() # 读取文件内容
print(stream.name) # 获取文件绝对路径
# 截取文件名
file = stream.name
filename = file[file.rfind('\\') + 1:]
path = os.path.dirname(__file__)
path1 = os.path.join(path, filename) # 在path下拼接一个文件
with open(path1, 'wb') as wstream:
wstream.write(container)
print('文件复制成功!')
os模块下方法 os.getcwd() 获取当前目录 os.listdir() 浏览文件夹 os.mkdir() 创建文件夹 os.rmdir() 删除空的文件夹 os.remove() 删除文件 os.chdir() 切换目录
import os
# 返回指定目录下所有的文件和文件夹,保存到列表中
a11 = os.listdir(r'E:\p1')
print(a11)
# 创建文件夹
f=os.mkdir(r'E:\p3')
print(f)
# 创建文件之前判断文件是否存在
if not os.path.exists(r'E:\p3'):
f = os.mkdir(r'E:\p3')
print(f)
# 删除文件夹,,rmdir():只能删除空文件夹
f=os.rmdir(r'E:\p3')
print(f)
f=os.removedirs(r'E:\p3')
print(f)
os.remove(r'E:\p3\p4\aa.doc') # 成功删除aa.doc
# 删除p4文件夹,p4文件夹里有文件
path = r'E:\p3\p4'
filelist = os.listdir(path)
for file in filelist:
path1 = os.path.join(path, file)
os.remove(path1)
else:
os.rmdir(path)
print('删除成功!')
# 切换目录
f = os.chdir('E:\p1')
print(f)
path = os.getcwd()
print(path)
文件复制:如何将一个文件夹里面的内容复制到另一个文件夹
# 封装成函数
import os
def copy(src, target): # src:原文件夹,target:目标文件夹
if os.path.isdir(src) and os.path.isdir(target):
# 浏览原文件夹中文件
filelist = os.listdir(src) # ['aa.txt','','',...,'']
# 遍历文件名
for file in filelist:
path = os.path.join(src, file) # 在原路径的基础上添加文件,得到完整路径
with open(path, 'rb') as rstream:
container = rstream.read()
# 获取文件名
path1 = os.path.join(target, file)
# open()只能打开文件,不能打开目录文件夹
with open(path1, 'wb') as wstream:
wstream.write(container)
else:
print('复制文件完成!')
copy('E:\p1', 'E:\p2')
'''
文件复制练习
'''
import os
src_path = r'E:\p1'
target_path = r'E:\p3'
def copy(src_path, target_path):
# 获取文件夹中内容
filelist = os.listdir(src_path) # ['a1.doc', 'aa.txt', 'pp', '人像图.jfif']
print(filelist)
# 变量列表
for file in filelist:
# 拼接路径
path = os.path.join(src_path, file)
# 判断是文件夹还是文件
if os.path.isdir(path):
# 递归调用
copy(path, target_path)
else:
# 不是文件夹则进行复制
with open(path, 'rb') as rstream:
container = rstream.read()
# 获取文件名
path1 = os.path.join(target_path, file)
# open()只能打开文件,不能打开目录文件夹
with open(path1, 'wb') as wstream:
wstream.write(container)
else:
print('复制完成!')
copy(src_path, target_path)
# 用户注册
def register():
username = input('输入用户名:')
password = input('输入密码:')
repassword = input('输入确认密码:')
if password == repassword:
# 保存信息
with open(r'E:\p1\book\users.txt', 'a') as wstream:
wstream.write('\n{} {}\n'.format(username, password)) # write需要的参数类型是字节对象不是字符串
print('用户注册成功!')
else:
print('密码不一致!')
register()
# 用户登录
def login():
username = input('输入用户名:')
password = input('输入密码:')
if username and password:
with open(r'E:\p1\book\users.txt') as rstream:
while True:
user = rstream.readline()
if not user:
print('用户名或者密码输入有误!')
break
input_user = '{} {}\n'.format(username, password)
if user == input_user:
print('用户登录成功!')
break
login()
# 展示图书
def show_books():
print('-------图书馆中书-------')
with open(r'E:\p1\book\books.txt', 'r', encoding='utf-8') as rstream:
books = rstream.readlines()
for book in books:
print(book)
show_books()
异常:运行时出现错误,xxxError
情况1: try: 有可能会产生多种异常 except 异常的类型1: pass except 异常的类型2: pass ... except Exception: pass 如果是多个except,Exception放在最下面
def func():
try: # 只要出现异常,下方代码都不执行;加上try后,会执行
n1 = int(input('输入第一个数字:'))
n2 = int(input('输入第二个数字:'))
oper = input('输入运算符号(+ - * %):')
result = 0
if oper == '+':
result = n1 + n2
elif oper == '-':
result = n1 - n2
elif oper == '*':
result = n1 * n2
elif oper == '/':
result = n1 / n2
else:
print('符号输入错误!')
print('结果是:', result)
#文件操作---》将运算结果放在一个文档里
# with open(r'E:\p1\aa.txt','w')as wstream:
# wstream.write('本次的运算结果:{}'.format(result))
#操作列表
list1=[]
list1.pop()
with open(r'E:\p1\aa2.txt', 'r') as wstream:#读一个不存在的文件
print(wstream.read())
except ZeroDivisionError:
print('除数不能为0!!!')
except ValueError:
print('必须输入数字!!')
# except FileExistsError:
# print('文件不存在!')
# except NameError:
# pass
except Exception as err:#可看出错误原因
print('出错了!',err)
func()
print('------>')
try: 有可能会产生多种异常 except 异常的类型1: pass ... else: 如果try中没有发生异常则进入的代码 注意:如果使用else则在try代码中不能出现return
def func():
try:
n1 = int(input('输入数字:'))
print(n1)
# return 1
except ValueError:
print('必须是数字')
# return 2
else:
print('数字输入完毕') # 没有异常才会执行的代码块
func()
文件操作;stream=open(...) stream.close()--->无论出现异常,都会执行 try: 可能出现的异常代码 except: 如果有异常执行的代码 finally: 无论是否存在异常都会被执行的代码
def func():
stream = None
try:
stream = open(r'E:\p1\aa.txt')
container = stream.read()
print(container)
return 1
except Exception as err:
print(err)
return 2
finally: # 有无异常都执行;如果有finally在,finally中return会覆盖其他中return
print('-------finally---')
if stream:
stream.close()
# return 3
x = func()
print(x)
抛出异常 手动异常 raise 格式: raise 异常类型('提示信息') 练习:注册 用户名必须6位
def register():
username = input('输入用户名:')
if len(username) < 6:
raise Exception('用户长度必须6位以上') # 抛出异常
else:
print('输入用户名:{}'.format(username))
try: # 接异常
register()
except Exception as err:
print(err) # 打印raise中错误类型
print('注册失败')
else:
print('注册成功')