【十三】Python-文件os-异常

文件os

文件:
文件操作:
  open()
  path,filename:
    path:
      绝对路径:C:\Users\running\Desktop\python基础\day13(6-14)\代码\day13_文件\images\girl.jpg
      相对路径:相对当前文件的路径。返回上层目录: ../
  mode:
  读:  rb  r
  写:  wb  w

  stream  =  open(file,mode)
  stream.read()
  stream.write()
  stream.close()

  with open(file,mode) as stream:
        操作代码

  os模块:

  os.path:常用函数
    os.path: 常用函数
     dirname() 获取指定文件的目录
     join()    拼接获取新的路径
     split()   分割(文件目录,文件名)
     splittext()  分割(文件目录\文件名,文件的扩展名)
     getsize()   获取文件大小

     isabs()   判断是否是绝对路径
     isfile()  判断是否是文件
     isdir()   判断是否是文件夹


  os常用函数
    os模块下方法:
    os.getcwd()  获取当前目录
    os.listdir()  浏览文件夹
    os.mkdir()  创建文件夹
    os.rmdir()  删除空的文件夹
    os.remove()  删除文件
    os.chdir()  切换目录
'''
os.path: 常用函数
 dirname() #获取当前文件所在文件夹路径
 join() #拼接
 split() #在文件和目录之间切一刀
 splittext() #分割文件与扩展名
 getsize() #获取文件的大小  单位字节
os.getcwd() #当前文件工作目录

 isabs() #判断是否是绝对路径
 isfile() #是否是文件
 isdir() #是否是目录
'''
import os
#判断是否是绝对路径
r = os.path.isabs(r'E:\Python Script\openstack_landscape.jpg')
print('----》', r) #----》 True

r = os.path.isabs('../../images/girl.jpg')  # ../ 表示返回当前文件的上一级  code
print('----->', r)

# 获取路径:directory 目录  文件夹
# 当前文件所在文件夹路径
path = os.path.dirname(__file__)  # C:/Users/running/Desktop/python基础/day13(6-14)/代码/day13_文件/code/aa
print(path)

path = os.path.abspath('aa.txt')
print(path)

# 获取当前文件的绝对路径
path = os.path.abspath(__file__)
print(path)

#当前文件工作目录
path = os.getcwd()  # 类似 os.path.dirname(__file__)
print(path)

#获取当前路径 是否是文件
r = os.path.isfile(os.getcwd())
print(r) #False

##获取当前路径 是否是目录
r = os.path.isdir(os.getcwd())
print(r) #True

#获取当前文件名
path = r'E:\2019千锋Python全套视频教程,史上最经典(193集)\2019版-千锋Python全套-源码+笔记+资料+作业\Week3(62集)\day13(9集)\代码\day13_文件\code\aa\file01.py'
#使用os.path.split 在文件和目录之间切一刀
result = os.path.split(path)
print(result)  # 有了两个元组数据  #('E:\\2019千锋Python全套视频教程,史上最经典(193集)\\2019版-千锋Python全套-源码+笔记+资料+作业\\Week3(62集)\\day13(9集)\\代码\\day13_文件\\code\\aa', 'file01.py')
print(result[1]) #file01.py
# filename = path[path.rfind('\\')+1:]

# splitext分割文件与扩展名
result = os.path.splitext(path)
print(result) #一个文件扩展名前面部分,和文件扩展名

# 获取文件的大小  单位字节
size = os.path.getsize(path)
print(size) #1819

result = os.path.join(os.getcwd(), 'file', 'a', 'a1.jpg') #file\a\a1.jpg
#E:\2019千锋Python全套视频教程,史上最经典(193集)\2019版-千锋Python全套-源码+笔记+资料+作业\Week3(62集)\day13(9集)\代码\day13_文件\code\aa\file\a\a1.jpg
print(result)

OS 其他函数

'''
os模块下方法:
os.getcwd()  获取当前目录
os.listdir()  浏览文件夹
os.mkdir()  创建文件夹
os.rmdir()  删除空的文件夹
os.remove()  删除文件
os.chdir()  切换目录
'''
import os

dir = os.getcwd()
print(dir) #E:\2019千锋Python全套视频教程,史上最经典(193集)\2019版-千锋Python全套-源码+笔记+资料+作业\Week3(62集)\day13(9集)\代码\day13_文件\code\aa

all = os.listdir(r'E:\2019千锋Python全套视频教程,史上最经典(193集)')  # 返回指定目录下的所有的文件和文件夹,保存到列表中
print(all) #['2019版-千锋Python全套-源码+笔记+资料+作业', '2019版-千锋Python全套-视频', '千锋Python学习路线图(1).jpg', '千锋Python学习路线图.jpg']

# 创建文件夹
if not os.path.exists(r'c:\p3'):
    f = os.mkdir(r'c:\p3')
    print(f) #None

# f = os.rmdir(r'c:\p3')  # 只能删除空的文件夹  OSError: [WinError 145] 目录不是空的。: 'c:\\p3'
# print(f) #
#
# f = os.removedirs(r'c:\p3') # 只能删除空的文件夹  OSError: [WinError 145] 目录不是空的。: 'c:\\p3'
# print(f) #None

# os.remove(r'C:\p3\ff\dfd.rtf')

# path = r'C:\p3\ff'
# filelist = os.listdir(path)
# print('filelist:',filelist) #filelist: ['11.txt', '22.txt']
#
# for file in filelist:
#     path1 = os.path.join(path,file)
#     os.remove(path1)
# else:
#     os.rmdir(path)
#
# print('Remove dir and file Success!') #Remove dir and file Success!

path = os.getcwd()
print('path:',path)

f = os.chdir(r'c:\p1')
print('f:',f) #None

path = os.getcwd()
print(path) #c:\p1

案例:图书馆

# 持久化保存:文件
# list 元组,字典---->内存

# 用户注册
def register():
    username = input('输入用户名:')
    password = input('输入密码:')
    repassword = input('输入确认密码:')

    if password == repassword:
        # 保存信息
        with open(r'c:\p1\book\users.txt', 'a') as wstream:
            wstream.write('{} {}\n'.format(username, password))

        print('用户注册成功!')
    else:
        print('密码不一致!')


# 用户登录
def login():
    username = input('输入用户名:')
    password = input('输入密码:')

    if username and password:
        # 打开文件查看
        with open(r'c:\p1\book\users.txt')  as rstream:
            # 逐行读取内容
            while True:
                # 读取一行内容
                user = rstream.readline()  # admin 123456\n
                # 判断有没有读取到内容
                if not user:
                    print('用户名或者密码输入有误!')
                    break
                # 构造比较格式
                input_user = '{} {}\n'.format(username, password)
                # 如果用户输入的跟文件中的内容一致则认为用户登录成功
                if user == input_user:
                    print('用户登录成功!')
                    break


def show_books():
    print('---------图书馆里面的图书有:----------')
    with open(r'c:\p1\book\books.txt', 'r') as rstream:
        books = rstream.readlines()
        for book in books:
            print(book, end='')  # 因为读取的内容中有\n 所以取消print中自带的末尾换行

# 调用函数:
# register()
# login()
# show_books()

异常

# 语法错误和异常
# 语法错误:
# while True:
#     print('-------')

# number = 100
#
#
# def func():
#     global number
#     number += 1


# 异常:程序运行的时候报出来的。xxxError
# def chu(a, b):
#     return a / b
#
#
# x = chu(4, 2)  # ZeroDivisionError: division by zero
# print('--------------->', x)

# 异常处理:
'''
格式:
try:
    可能出现异常的代码
except:
    如果有异常执行的代码
[finally:
    无论是否存在异常都会被执行的代码]

情况1:
  try:
     有可能会产生多种异常
  except 异常的类型1:
        print(。。。。)
  except 异常类型2:
       pass

'''
def func():
    try:
        n1 = int(input('输入第一个数字:'))
        n2 = int(input('输入第二个数字:'))
        # + 加法
        per = input('输入运算符号(+ - * /):')

        result = 0
        if per == '+':
            result = n1 + n2
        elif per == '-':
            result = n1 - n2
        elif per == '*':
            result = n1 * n2
        elif per == '/':
            result = n1 / n2
        else:
            print('符号输入有误!')

        print('结果是:', sum)
    except ZeroDivisionError:
        print('除数不能为零!!!!')
    except ValueError:
        print('必须输入数字!!!!')
    except FileNotFoundError:
        pass
    except NameError:
        pass
    except Exception:
        pass

func()

print('------------>')

异常2

'''
格式:
try:
    可能出现异常的代码
except:
    如果有异常执行的代码
[finally:
    无论是否存在异常都会被执行的代码]


情况1:
  try:
     有可能会产生多种异常
  except 异常类型1:
        print(。。。。)
  except 异常类型2:
       pass
  except Exception:
       pass

  如果是多个except,异常类型的顺序需要注意,最大的Exception要放到最后



情况2:获取Exception的错误原因
try:
     有可能会产生多种异常
  except 异常类型1:
        print(。。。。)
  except 异常类型2:
       pass
  except Exception as err:
       print(err)  ----> err的内容就是错误原因:

   pop from empty list  ---》 从空的列表中删除内容
   。。。

'''
def func():
    try:
        n1 = int(input('输入第一个数字:'))
        n2 = int(input('输入第二个数字:'))
        # + 加法
        per = input('输入运算符号(+ - * /):')

        result = 0
        if per == '+':
            result = n1 + n2
        elif per == '-':
            result = n1 - n2
        elif per == '*':
            result = n1 * n2
        elif per == '/':
            result = n1 / n2
        else:
            print('符号输入有误!')

        print('结果是:', result)

        # 操作列表
        list1 = []
        list1.pop()  #

        # 文件操作
        with open(r'c:\p1\aa.txt', 'r') as  wstream:
            print(wstream.read())

    except ZeroDivisionError:
        print('除数不能为零!!!!')
    except ValueError:
        print('必须输入数字!!!!')
    except Exception as err:
        print('出错啦!', err)


func()

print('------------>')

异常3

# 异常
'''
 情况3:try...except..(多个except)...else
  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()

异常4

# 异常情况4
'''
# 文件操作  stream = open(...)   stream.read()   stream.close()
# 数据库操作  close()
try;
   pass
except:
   pass
finally: 
   pass

'''


def func():
    stream = None
    
    try:
        stream = open(r'c:\p1\aa1.txt')
        container = stream.read()
        print(container)
        stream.close()
        return 1
    except Exception as err:
        print(err)
        return 2
    finally:
        print('------finally-----')
        if stream:
            stream.close()
        # return 3


x = func()
print(x) #会返回return 3 即使上面的return 1  如果finally里没有return 还是返回return 1 

异常抛出异常 raise

# 抛出异常 raise

# 注册 用户名必须6位
def register():
    username = input('输入用户名:')
    if len(username) < 6:
        raise Exception('用户长度必须6位以上')
    else:
        print('输入的用户名是:', username)


try:
    register()
except Exception as err:
    print(err)
    print('注册失败!')
else:
    print('注册成功!')
    # print(a)

 

posted @ 2023-10-11 10:11  しみずよしだ  阅读(48)  评论(0)    收藏  举报