异常处理、深浅拷贝、基本的文件操作

时间:2019-08-06
本文章向大家介绍异常处理、深浅拷贝、基本的文件操作,主要包括异常处理、深浅拷贝、基本的文件操作使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、异常处理

​ 异常有分为语法错误和逻辑错误

1、异常的种类

1.1 常用异常

  • AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
  • IOError 输入/输出异常;基本上是无法打开文件
  • ImportError 无法引入模块或包;基本上是路径问题或名称错误
  • IndentationError 语法错误(的子类) ;代码没有正确对齐
  • IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
  • KeyError 试图访问字典里不存在的键
  • KeyboardInterrupt Ctrl+C被按下
  • NameError 使用一个还未被赋予对象的变量
  • SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
  • TypeError 传入对象类型与要求的不符合
  • UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
  • ValueError 传入一个调用者不期望的值,即使值的类型是正确的

2、异常处理

2.1 之后预防处理

如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理

#基本语法为
try:
    被检测的代码块
except 异常类型:
    try中一旦检测到异常,就执行这个位置的逻辑
    
#  举例
try:
    f = [
        'a',
        'a',
        'a',
        'a',
        'a',
        'a',
        'a',
    ]
    g = (line.strip() for line in f)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
except StopIteration:
    f.close()

2.2 万能异常处理:Exception

别的基本用不到,Exception是万能的

s1 = 'hello'
try:
    int(s1)
except Exception as e:
    print(e)

二、数据类型分类

按存值个数区分

存值个数 数据类型
单个值 整型、浮点型、字符串
多个值 列表、字典、元组、集合

按可变不可变区分

可变or不可变 数据类型
可变 列表、字典、集合
不可变 整型、浮点型、字符串、元组

按有序无序区分

有序or无序 数据类型
有序 字符串、列表、元组
无序 字典、集合

按访问类型区分

访问类型 数据类型
直接访问 整型、浮点型
顺序访问(序列类型) 字符串、列表、元组
key值访问(映射类型) 字典

三、python深浅拷贝

1、拷贝

list2是list1的拷贝对象,list1内的任何数据类型的元素变化,list2都会跟着变化,因为列表是可变类型

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = l1

l1.append('g')
print(l1)  # ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)  # ['a', 'b', 'c', ['d', 'e', 'f'], 'g']

2、浅拷贝

需导入一个包:import copy,list2=copy.copy(list1),list2是list1的浅拷贝对象,list1内的不可变数据类型元素发生改变,list2不变;list1内的可变数据类型元素发生改变,list2会跟着改变

import copy

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.copy(l1)

l1.append('g')
print(l1)   # ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)   # ['a', 'b', 'c', ['d', 'e', 'f']]

l1[3].append('g')
print(l1)   # ['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2)   # ['a', 'b', 'c', ['d', 'e', 'f', 'g']]

3、深拷贝

需导入一个包:import copy,list2=copy.deepcopy(list1),list2是list1的深拷贝对象,list1内的不可变数据类型元素发生改变,list2不变;list1内的可变数据类型元素发生改变,list2也不会改变。即list2永远不会因为list1的改变而改变

import copy

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.deepcopy(l1)

l1.append('g')
print(l1)   # ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)   # ['a', 'b', 'c', ['d', 'e', 'f']]

l1[3].append('g')
print(l1)   # ['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2)   # ['a', 'b', 'c', ['d', 'e', 'f']]

四、基本的文件操作

1、打开文件

f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt')
print(f)

打开文件需要注意编码格式,我的电脑打开文件必须在open里加入encoding='UTF-8'

f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt',encoding='UTF-8')
print(f)

2、读取数据

打开文件之后,文件不仅占用了内存,他还对应了操作系统打开的以文件,相当于使用文本编辑器打开了一个文件。并且我们说了我们操控文件只是为了读和写,因此打开文件并不是目的,读和写才是目的,接下来我们尝试如何读写文件。


f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt', mode='r')  # read模式打开文件

data = f.read()
print(data)   # 读取文件内容,向操作系统发起读请求,会被操作系统转成具体的硬盘操作,将内容由硬盘读入内存

f.close()  #  关闭文件 # 由于Python的垃圾回收机制只回收引用计数为0的变量,但是打开文件还占用操作系统的资源,所以我们需要回收操作系统的资源资源
# del f 只是回收变量f

3、写入数据

# write模式打开文件
f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt', mode='w')
f.write("""name = 'nick'
pwd = '123'""")
f.close()
f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt', mode='r')
data = f.read()
print(data)

五、绝对路径和相对路径

1、绝对路径

  • Windows系统绝对路径从盘符(C:、D:)开始写一个完整的路径。
  • macos系统从根目录(/Users)开始写一个完整的路径。

2、相对路径

相对于当前执行文件所在的文件夹开始找。

f = open('32.txt')  # 32.txt与该.md文档同路径位置

原文地址:https://www.cnblogs.com/zhuangyl23/p/11312175.html