读文件:
open(path/filename,'rt')----->返回值:stream(管道)
container=stream.read()------>读取管道中内容
注:如果传递的path/filename有误,则会报错:FileNotFoundError
如果是图片,不能使用默认的读取方式,需要mode=’rb‘
总结:read()
stream = open(r'E:p1aa.txt') # mode默认是read.绝对路径 container = stream.read() # read() print(container)
readline():每次读取一行
stream = open(r'E:p1aa.txt')
line = stream.readline()#读取一行
print(line)
# 读取所有内容
while True:
line=stream.readline()
print(line)
if not line:
break
readlines():读取所有行,保存到列表中
stream = open(r'E:p1aa.txt')
lines=stream.readlines()#['feskhsjn', 'hfshfhs']将内容保存到列表中
print(lines)
# 将列表中内容打印出
lines=stream.readlines()
print(lines)
for i in lines:
print(i)
readable():判断是否可读
stream = open(r'E:p1aa.txt') result = stream.readable() # 方法后面加able,判断是否,返回值为bool类型 print(result)
写文件
mode='w'-->表示写操作,会将原有内容清空
方法:
write(内容):每次都会将原来的内容清洗,然后写当前的内容
stream = open(r'E:p1aa.txt', 'w')
# '''...'''保留格式输出
s = '''
你好!
欢迎来到赌场....
邀请人:高静
'''
result = stream.write(s) # 写操作:
stream.write('张三')
stream.writelines(['nhello worldn', '快乐星球n'])
# ...只要管道不关闭,可以无限添加
stream.close() # 内存将通道回收,释放资源
writelines(iterable):没有换行的效果,需自加
mode='a'---->追加,不会清空当前内容。append
stream = open(r'E:p1aa.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:pcodeaa文件操作.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:pcodeaa文件操作.py'
result = os.path.splitext(path) # ('D:\p\code\aa\文件操作', '.py')
print(result[1])
os.path.getsize(path):获取文件的大小,单位字节
import os path = r'D:pcodeaa文件操作.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:p3p4aa.doc') # 成功删除aa.doc
# 删除p4文件夹,p4文件夹里有文件
path = r'E:p3p4'
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:p1bookusers.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:p1bookusers.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:p1bookbooks.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:p1aa.txt','w')as wstream:
# wstream.write('本次的运算结果:{}'.format(result))
#操作列表
list1=[]
list1.pop()
with open(r'E:p1aa2.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:p1aa.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('注册成功')



