1.异常的简介

----程序在运行过程中可能会出现一些错误。比如: 使用了不存在的索引,两个不
同类型的数据相加…这些错误我们称之为异常
----处理异常 程序运行时出现异常,目的并不是让我们的程序直接终止!Python
是希望在出现异常时,我们可以编写代码来对异常进行处理

异常
程序在运行的过程当中 不可避免出现一些错误,,,,这些错误 我们称之为异常
异常以后的代码都不会执行
# print(b)#NameError: name 'b' is not definedprint('python')print('java')python
java

print('python')
print(b)
print('java')NameError: name 'b' is not defined
python

●try 语句

●try:
— 代码块(可能出现错误的语句)
●except:
— 代码块(出现错误以后我的处理方式)
●else:
— 代码块(没有出错我要执行的语句)

print('python')
try:print(b)
except:print('出错了...')print('java')python
出错了...
java

加上else语句


print('python')
try:print(b)
except:print('出错了...')
else:print('程序正常执行没有错误...')
print('java')python
出错了...
java

上面的else并没有执行

print('python')
try:print(66)
except:print('出错了...')
else:print('程序正常执行没有错误...')
print('java')python
66
程序正常执行没有错误...
java

2.异常的传播

●当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会在进
行传播。如果函数中没有对异常进行处理,则异常会继续向函数调用传播。
如果函数调用处处理了异常,则不再传播异常,如果没有处理则继续向调用
处传播。直到传递到全局作用域(主模块)如果依然没有处理,则程序终止,并
显示异常信息。
●当程序运行过程中出现异常以后,所有异常信息会保存到一个异常对象中。
而异常传播时,实际上就是异常对象抛给了调用处


def fn():print('我是fn...')fn()我是fn...
print(100/0)def fn():print('我是fn...')fn()ZeroDivisionError: division by zero零除法错误:被零除
# print(100/0)#ZeroDivisionError: division by zerodef fn():print('我是fn...')print(100 / 0)fn()Traceback (most recent call last):File "D:/LongProject/基础班/异常的传播.py", line 8, in <module>fn()File "D:/LongProject/基础班/异常的传播.py", line 6, in fnprint(100 / 0)
ZeroDivisionError: division by zero

由上可看出第6行出现了异常 但是异常并没有终止 导致我们的第9行也出现了异常

def fn():print('我是fn...')print(100 / 0)try:fn()
except:pass我是fn...

案例

def fn1():print('我是fn1')print(100 / 0)def fn2():print('我是fn2')fn1()def fn3():print('我是fn3')fn2()fn3()    #我们直接调用fn3Traceback (most recent call last):File "D:/LongProject/基础班/异常的传播.py", line 31, in <module>fn3()File "D:/LongProject/基础班/异常的传播.py", line 29, in fn3fn2()File "D:/LongProject/基础班/异常的传播.py", line 25, in fn2fn1()File "D:/LongProject/基础班/异常的传播.py", line 21, in fn1print(100 / 0)
ZeroDivisionError: division by zero
我是fn3
我是fn2
我是fn1

由上中line值变化可看出
异常是有一个传播流程的 首先print(100 / 0)这行出现了异常 但是没有处理 然后异常如下图传播 最后传播到全局作用域

#异常的传播
#当中函数中出现了异常,如果你对异常进行处理,则异常不再继续传播
#如果你在函数中没有处理,则异常会继续向函数调用出传播
#直到传递到去全局作用域,如果依然没有处理,则程序终止,并且显示异常信息
#当这个程序在运行的的过程中出现异常,所以异常信息会被保存到一个专门的异常对象中
#而异常传播时,实际上就是异常对象抛给了调用处

这个ZeroDivisionError是个异常对象 因为首字母是大写 这就是类 例如还 NameError
TypeError KeyError
而ZeroDivisionError 就是因为除零错误所以创建一个除零错误的实例

print(ZeroDivisionError)<class 'ZeroDivisionError'>

可以去官网找一些异常信息(Built-in Exceptions 就是内置异常)

https://docs.python.org/3/library/exceptions.html
---------(建议用Google Chrome 转换中文)----------

3.异常的对象

print('异常出现前...')try:print(b)print(100/0)
except:#如果在except后面不加任何的内容,此时它会捕获所有的异常print('开始处理错误了')print('异常出现后...')异常出现前...
开始处理错误了
异常出现后...
print('异常出现前...')try:print(b)print(100/0)
except NameError: #这样它只会捕获NameError#如果在except后面不加任何的内容,此时它会捕获所有的异常print('出现NameError的错误了')print('异常出现后...')异常出现前...
出现NameError的错误了
异常出现后...
print('异常出现前...')try:# print(b)print(100/0)
except NameError: #这样它只会捕获NameError  只会管NameError#如果在except后面不加任何的内容,此时它会捕获所有的异常print('出现NameError的错误了')print('异常出现后...')Traceback (most recent call last):File "D:/LongProject/基础班/异常对象.py", line 5, in <module>
异常出现前...print(100/0)
ZeroDivisionError: division by zero
print('异常出现前...')try:# print(b)print(100/0)
except NameError: #这样它只会捕获NameError 只会管NameError#如果在except后面不加任何的内容,此时它会捕获所有的异常#如果在except后面跟着一个异常类型,那么它只会捕获该类型的异常print('出现NameError的错误了')
except ZeroDivisionError:print('出现ZeroDivisionError的错误了')print('异常出现后...')异常出现前...
出现ZeroDivisionError的错误了
异常出现后...

Exception就是这些类错误(NameError 如TypeError KeyError)的父类

print('异常出现前...')try:# print(b)print(100/0)   这里换成print(b) 再把print(100/0)注释掉  那么结果是不会变的
# except NameError: #这样它只会捕获NameError 只会管NameError
#     #如果在except后面不加任何的内容,此时它会捕获所有的异常
#     #如果在except后面跟着一个异常类型,那么它只会捕获该类型的异常
#     print('出现NameError的错误了')
# except ZeroDivisionError:
#     print('出现ZeroDivisionError的错误了')
except Exception:print('我也不知道你是什么异常')
print('异常出现后...')异常出现前...
我也不知道你是什么异常
异常出现后...

下面这种写法就会好很多


print('异常出现前...')try:print(b)# print(100/0)
except Exception as e:  #这样就是把异常对象Exception赋值给了e 此时 e 就是异常对象print('出现异常了',e,type(e))
print('异常出现后...')异常出现前...
出现异常了 name 'b' is not defined <class 'NameError'>
异常出现后...

当然 还有最终版

print('异常出现前...')try:print(666)# print(100/0)
except Exception as e:  #这样就是把异常对象Exception赋值给了e 此时 e 就是异常对象print('我也不知道你是什么异常',e,type(e))finally:print('无论是是否出现异常我们都会执行')
print('异常出现后...')

try 语句的最终写法

print('异常出现前...')try:print(666/0)# print(100/0)
except Exception as e:  #这样就是把异常对象Exception赋值给了e 此时 e 就是异常对象print('出现异常了',e,type(e))  #也可以看出 except此处并非是‘除了’的意思 其后的错误类型如果符合则会执行其语句内的内容   如 print('出现异常了',e,type(e)) finally:print('无论是是否出现异常  我们都会执行')
print('异常出现后...')异常出现前...
出现异常了 division by zero <class 'ZeroDivisionError'>
无论是是否出现异常  我们都会执行
异常出现后...

4.打开文件

●文件(file) 通过Python程序来对计算机中的各种文件进行增删改查的操作 文
件也叫I/O(Input/Output)
●文件的操作步骤
-----打开文件
-----对文件进行各种操作(读、写)然后保存
-----关闭文件
●文件会有一个返回值。返回一个对象,这个对象就表示的是当前的文件
我们先创建一个文件

在文件中写内容

在python中有一个内建函数叫open

按住Ctrl 键加上鼠标左键 点击open( )函数会自动获取一个文件 builtins.py

# open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

参数很多但是没关系 有None不用管 真正要管就是前两个参数


文件(File)I/O  (Input/Output)
通过python程序来对计算机中的各种文件进行
操作文件的步骤
1. 打开文件
2.对文件进行读写操作(再保存)
3.关闭文件open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
参数file  要打开的文件的名字(路径)
返回值,返回的是一个对象 代表的是当前打开的文件file_name='demo.txt'open(file_name)        运行后什么也没有

只要没有报错 就证明他打开了

我们可以整一个错误文件

#返回值,返回的是一个对象 代表的是当前打开的文件

file_name='demo.txt'file_obj=open(file_name)
print(file_obj)<_io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'>  #这就是当前打开的文件对象模式 只读   编码 cp936

我们再把 demo.txt 文件拖入到LongProject 文件夹下

再打开时

可以copy path 下demo.txt文件
D:\LongProject\demo.txt

file_name='demo.txt'
# D:\LongProject\demo.txt
file_name=r'D:\LongProject\demo.txt'         这里前面建议加上一个原始字符串r
file_obj=open(file_name)
print(file_obj)<_io.TextIOWrapper name='D:\\LongProject\\demo.txt' mode='r' encoding='cp936'>


再把demo.txt 移动到基础班文件夹中 方便下面演示

5.关闭文件

●调用close()方法来关闭文件
●with…as 语句不用写close()来关闭。它自带关闭

#当我们获取了文件对象之后,所有的操作都是通过文件对象来操作的(就是关闭 读取都是对文件对象的)
#读取文件内容
#read()函数来读取内容它会将读取到的内容保存到一个字符串当中

file_name='demo.txt'
#当我们获取了文件对象之后,所有的操作都是通过文件对象来操作的(就是关闭 读取都是对文件对象的)#读取文件内容
#read()函数来读取内容它会将读取到的内容保存到一个字符串当中
file_obj=open(file_name)content=file_obj.read()print(content)nkkjlkjkjz

但是如果 demo.txt 文件中内容是汉字 那么会报错的

##关闭文件

#当我们获取了文件对象之后,所有的操作都是通过文件对象来操作的(就是关闭 读取都是对文件对象的)#读取文件内容
#read()函数来读取内容它会将读取到的内容保存到一个字符串当中
file_name='demo.txt'file_obj=open(file_name)content=file_obj.read()#关闭文件
file_obj.close()没有什么结果
file_obj=open(file_name)content=file_obj.read()# print(content)#关闭文件
file_obj.close()file_obj.read()ValueError: I/O operation on closed file.
值错误:对关闭的文件执行I/O操作。

with…as语句

file_name='demo.txt'
#当我们获取了文件对象之后,所有的操作都是通过文件对象来操作的(就是关闭 读取都是对文件对象的)#读取文件内容
#read()函数来读取内容它会将读取到的内容保存到一个字符串当中
file_obj=open(file_name)content=file_obj.read()# print(content)#关闭文件
# file_obj.close()# file_obj.read()
#with...as语句with open(file_name) as file_obj:#在with 语句中直接使用file_obj来操作文件print(file_obj.read())    #如果这里是file_obj.read()  不打印的话执行是没有结果的nkkjlkjkjz
file_name='demo.txt'
#当我们获取了文件对象之后,所有的操作都是通过文件对象来操作的(就是关闭 读取都是对文件对象的)#读取文件内容
#read()函数来读取内容它会将读取到的内容保存到一个字符串当中
file_obj=open(file_name)content=file_obj.read()# print(content)#关闭文件
# file_obj.close()# file_obj.read()
#with...as语句with open(file_name) as file_obj:#在with 语句中直接使用file_obj来操作文件print(file_obj.read())print(file_obj.read())ValueError: I/O operation on closed file.
值错误:对关闭的文件执行I/O操作。

可以看出在 with…as语句外 再打印时 文件已经关闭了
这样的好处是我们不用去手动写close 语句

file_name=‘python’ #就是再次给file_name 赋值

file_name='demo.txt'
file_obj=open(file_name)content=file_obj.read()file_name='python' #就是再次给file_name 赋值
with open(file_name) as file_obj:#在with 语句中直接使用file_obj来操作文件print(file_obj.read())
print(file_obj.read())FileNotFoundError: [Errno 2] No such file or directory: 'python'FileNotFoundError:[Errno 2]没有这样的文件或目录:“python”

我们利用前面学习的知识

file_name='demo.txt'
file_obj=open(file_name)content=file_obj.read()file_name='python' #就是再次给file_name 赋值
try:with open(file_name) as file_obj:#在with 语句中直接使用file_obj来操作文件print(file_obj.read())except FileNotFoundError:print(f'{file_name}文件不存在')python文件不存在

再把file_name='python’注释掉

file_name='demo.txt'
file_obj=open(file_name)content=file_obj.read()# file_name='python' #就是再次给file_name 赋值
try:with open(file_name) as file_obj:#在with 语句中直接使用file_obj来操作文件print(file_obj.read())except FileNotFoundError:print(f'{file_name}文件不存在')nkkjlkjkjz

6.读取文件


在读取文件.py中操作

file_name='demo.txt'try:with open(file_name) as file_obj:content=file_obj.read()print(content)except FileNotFoundError:print(f'{file_name}文件不存在')nkkjlkjkjz

于是我们继续在基础班文件夹下继续创建demo2.txt

file_name='demo2.txt'try:with open(file_name) as file_obj:content=file_obj.read()print(content)except FileNotFoundError:print(f'{file_name}文件不存在')UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 16: illegal multibyte sequence
UnicodeDecodeError:“gbk”编解码器无法解码位置16中的字节0xaf:非法的多字节序列

#用open()来打开了一个文件。打开的文件可以分为2种类型
#一种是纯文本文件(使用utf-8编写的文本文件)
#另一种是二进制文件(广义的说除了纯文本文件剩下的都是二进制文件 狭义的 就是图片 音频 视频 ppt…)
Unicode就是万国码.

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

encoding=None 说明open() 没有设置编码格式 但是最基本的英文(ascii 库)它是可以处理 ,但是中文不能处理
我们可以这样操作


file_name='demo2.txt'try:with open(file_name,encoding='utf-8') as file_obj:content=file_obj.read()print(content)except FileNotFoundError:print(f'{file_name}文件不存在')行不得反求诸己
躬自厚责薄于人

但是有一个隐患 读取较大文件不要用read()
我们可以调用help函数寻求帮助
help(file_obj.read) #此处传函数对象


file_name='demo2.txt'try:with open(file_name,encoding='utf-8') as file_obj:help(file_obj.read) #函数对象content=file_obj.read()print(content)except FileNotFoundError:print(f'{file_name}文件不存在')Help on built-in function read:read(size=-1, /) method of _io.TextIOWrapper instanceRead at most n characters from stream.Read from underlying buffer until we have n characters or we hit EOF.If n is negative or omitted, read until EOF.行不得反求诸己
躬自厚责薄于人

我们只需关注read(size=-1, /)中的size=-1

read()

#read()可以接受一个size作为参数来传递 默认值为-1会读取所有
#该参数是用来指定读取的字符的数量

file_name='demo2.txt'try:with open(file_name,encoding='utf-8') as file_obj:# help(file_obj.read) #函数对象content=file_obj.read(-1)  #默认值为-1  加上后所以并不会有什么改变print(content)print(len(content))
except FileNotFoundError:print(f'{file_name}文件不存在')行不得反求诸己
躬自厚责薄于人      因为加上了 一个换行(也就是换行符/n占一个)  所以是 2*7+1=15
15

我们再在demo2.txt中加上两句话

file_name='demo2.txt'try:with open(file_name,encoding='utf-8') as file_obj:#read()可以接受一个size作为参数来传递 默认值为-1会读取所有#该参数是用来指定读取的字符的数量# help(file_obj.read) #函数对象content=file_obj.read(6)print(content)print(len(content))
except FileNotFoundError:print(f'{file_name}文件不存在')行不得反求诸
6

我们在 content=file_obj.read(6)后再跟上 content=file_obj.read(6)

file_name='demo2.txt'try:with open(file_name,encoding='utf-8') as file_obj:#read()可以接受一个size作为参数来传递 默认值为-1会读取所有#该参数是用来指定读取的字符的数量# help(file_obj.read) #函数对象content=file_obj.read(6)content=file_obj.read(6)print(content)print(len(content))
except FileNotFoundError:print(f'{file_name}文件不存在')己
躬自厚责       (接着上面已经读取的读取  6个长度 加上 换行符/n算一个)
6

再加个content=file_obj.read(6)

file_name='demo2.txt'try:with open(file_name,encoding='utf-8') as file_obj:#read()可以接受一个size作为参数来传递 默认值为-1会读取所有#该参数是用来指定读取的字符的数量# help(file_obj.read) #函数对象content=file_obj.read(6)content=file_obj.read(6)content=file_obj.read(6)print(content)print(len(content))
except FileNotFoundError:print(f'{file_name}文件不存在')薄于人
工欲
6

#read()可以接受一个size作为参数来传递 默认值为-1会读取所有
#该参数是用来指定读取的字符的数量
#可以为size指定一个值。这样read()会读取指定数量的字符
#每一次读取的时候都是从上一次读取的位置来读取
#如果剩余字符的数量小于size 则一下读取剩余的内容

上面的读取文件 一下子读取出来的方式 是适合较小文件的
但是大文件就得一点一点读完
再次将demo.txt补充一下

file_name='demo.txt'try:with open(file_name,encoding='utf-8') as file_obj:#read()可以接受一个size作为参数来传递 默认值为-1会读取所有#该参数是用来指定读取的字符的数量#可以为size指定一个值。这样read()会读取指定数量的字符#每一次读取的时候都是从上一次读取的位置来读取#如果剩余字符的数量小于size 则一下读取剩余的内容# help(file_obj.read) #函数对象# content=file_obj.read(6)# content=file_obj.read(6)# content = file_obj.read(6)# print(content)# print(len(content))#定义一个变量来指定读取的大小chunk=100   #此处的100有些不太理解的   但是如果把chunk=10  就会发生奇怪的结果while True:content=file_obj.read(chunk)print(content)# 没有内容退出循环if not content:breakprint(content,end='') #最好是在循环外面打印except FileNotFoundError:print(f'{file_name}文件不存在')

最终操作示范(读取较大文件)


file_name='demo.txt'try:with open(file_name,encoding='utf-8') as file_obj:#read()可以接受一个size作为参数来传递 默认值为-1会读取所有#该参数是用来指定读取的字符的数量#可以为size指定一个值。这样read()会读取指定数量的字符#每一次读取的时候都是从上一次读取的位置来读取#如果剩余字符的数量小于size 则一下读取剩余的内容# help(file_obj.read) #函数对象# content=file_obj.read(6)# content=file_obj.read(6)# content = file_obj.read(6)# print(content)# print(len(content))#定义一个变量来保存结果file_content=''#定义一个变量来指定读取的大小chunk=100while True:content=file_obj.read(chunk)print(content)# 没有内容退出循环if not content:break# print(content,end='') #最好是在循环外面打印file_content+=contentexcept FileNotFoundError:print(f'{file_name}文件不存在')print(file_content)nkkjlkjkjzdfdfsaf
fsafasfsafafsfsadfsdafsdf
dfsafasdfsadfsadf
sdfafasdfagerhrtjhjjnkkjlkjkjzdfdfsaf
fsafasfsafafsfsadfsdafsdf
dfsafasdfsadfsadf
sdfafasdfagerhrtjhjj

除了上面的读取较大文件方式还有另一种

readline( )和readlines( ) (另一种读取较大文件方式)

●readline() 该方法可以读取一行内容
●readlines() 用于一行一行的读取 它会将读取的内容全部封装到一个列表当中返回

还是先拿最初版本(直接读取完的)示范 再…

file_name='demo.txt'with open(file_name,encoding='utf-8') as file_obj:print(file_obj.read())nkkjlkjkjzdfdfsaf
fsafasfsafafsfsadfsdafsdf
dfsafasdfsadfsadf
sdfafasdfagerhrtjhjj        这种方式是不建议使用的

readline() 该方法可以读取一行内容

file_name='demo.txt'with open(file_name,encoding='utf-8') as file_obj:# print(file_obj.read())#readline() 该方法可以读取一行内容print(file_obj.readline())nkkjlkjkjzdfdfsaf
file_name='demo.txt'with open(file_name,encoding='utf-8') as file_obj:# print(file_obj.read())#readline() 该方法可以读取一行内容print(file_obj.readline())print(file_obj.readline())nkkjlkjkjzdfdfsaffsafasfsafafsfsadfsdafsdf
file_name='demo.txt'with open(file_name,encoding='utf-8') as file_obj:# print(file_obj.read())#readline() 该方法可以读取一行内容print(file_obj.readline())print(file_obj.readline())print(file_obj.readline())nkkjlkjkjzdfdfsaffsafasfsafafsfsadfsdafsdfdfsafasdfsadfsadf

但是可以明显的发现换行了

并且是最后一行离Process finished with exit code 0 这行是有2行的 默认只会有一行
所以是自动换行了


file_name='demo.txt'with open(file_name,encoding='utf-8') as file_obj:# print(file_obj.read())#readline() 该方法可以读取一行内容print(file_obj.readline(),end='')print(file_obj.readline(),end='')print(file_obj.readline())nkkjlkjkjzdfdfsaf
fsafasfsafafsfsadfsdafsdf
dfsafasdfsadfsadf

最后一个print(file_obj.readline())没有加end=’’ 所以还是换行了 离Process finished with exit code 0 是两行的

file_name='demo.txt'with open(file_name,encoding='utf-8') as file_obj:# print(file_obj.read())#readline() 该方法可以读取一行内容print(file_obj.readline(),end='')print(file_obj.readline(),end='')print(file_obj.readline(),end='')


readlines() 用于一行一行的读取 它会将读取的内容全部封装到一个列表当中返回

file_name='demo.txt'with open(file_name,encoding='utf-8') as file_obj:#readlines() 用于一行一行的读取  它会将读取的内容全部封装到一个列表当中返回r=file_obj.readlines()print(r)['nkkjlkjkjzdfdfsaf\n', 'fsafasfsafafsfsadfsdafsdf\n', 'dfsafasdfsadfsadf\n', 'sdfafasdfagerhrtjhjj']可看出列表中每一段字符串或者是每一个换行就是一个元素
file_name='demo.txt'with open(file_name,encoding='utf-8') as file_obj:# print(file_obj.read())#readline() 该方法可以读取一行内容# print(file_obj.readline(),end='')# print(file_obj.readline(),end='')# print(file_obj.readline(),end='')#readlines() 用于一行一行的读取  它会将读取的内容全部封装到一个列表当中返回r=file_obj.readlines()print(r)print(len(r))print(r[0])['nkkjlkjkjzdfdfsaf\n', 'fsafasfsafafsfsadfsdafsdf\n', 'dfsafasdfsadfsadf\n', 'sdfafasdfagerhrtjhjj']
4
nkkjlkjkjzdfdfsaf

小小结 end=’ ’ 用于取消换行 /n用于换行

7.文件的写入

●write() 向文件写人内容
●如果操作的是一个文本文件,write()需要传递一个字符串
●操作文件的时候要指定操作的类型
●w表示的是可写 使用w写入文件的时候 如果文本不存在会创建文件 如果存在则会覆盖原文件
●而且这个写入是有返回值的 它返回的是你写入的几个字符
r = file_obj.write(str(66) )
print( r )
即这样的操作
●a表示追加

创建 文件写入.py (文件写入.py要和demo.txt)在基础班文件下

file_name='demo.txt'with open(file_name,encoding='utf-8')as file_obj:#write() 向文件写人内容#如果操作的是一个文本文件,write()需要传递一个字符串file_obj.write('nice to meet you')io.UnsupportedOperation: not writable不支持操作:不可写
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

mode=‘r’ 这个意思就是模式是读 而你是要写 所以你得指定一个类型操作

file_name='demo.txt'with open(file_name,'w',encoding='utf-8')as file_obj:#write() 向文件写人内容#如果操作的是一个文本文件,write()需要传递一个字符串#操作文件的时候要指定操作的类型#w表示的是可写 使用w写入文件的时候 如果文本不存在会创建文件  如果存在则会覆盖原文件file_obj.write('nice to meet you')

我们再看看demo.txt文件里的内容 demo.txt中的内容由原来的乱字母改变成了 nice to meet you

file_name='demo3.txt'with open(file_name,'w',encoding='utf-8')as file_obj:#write() 向文件写人内容#如果操作的是一个文本文件,write()需要传递一个字符串#操作文件的时候要指定操作的类型#w表示的是可写 使用w写入文件的时候 如果文本不存在会创建文件  如果存在则会覆盖原文件file_obj.write('abc')file_obj.write('def')   #这样同时写的时候不会覆盖的  这样也是不能说覆盖file_obj.write('ghi')   执行

file_name='demo3.txt'with open(file_name,'w',encoding='utf-8')as file_obj:#write() 向文件写人内容#如果操作的是一个文本文件,write()需要传递一个字符串#操作文件的时候要指定操作的类型#w表示的是可写 使用w写入文件的时候 如果文本不存在会创建文件  如果存在则会覆盖原文件file_obj.write('sdd')file_obj.write('eff')   #这写会覆盖原来的(上图中demo.txt的内容)file_obj.write('php')

这算是覆盖了文件的原有内容

file_name='demo3.txt'with open(file_name,'w',encoding='utf-8')as file_obj:#write() 向文件写人内容#如果操作的是一个文本文件,write()需要传递一个字符串#操作文件的时候要指定操作的类型#w表示的是可写 使用w写入文件的时候 如果文本不存在会创建文件  如果存在则会覆盖原文件file_obj.write('sdd')file_obj.write('eff')   #这样同时写的时候不会覆盖的file_obj.write('php')file_obj.write(666)TypeError: write() argument must be str, not int
类型错误:write()参数必须是str,而不是int     因为write()需要传递一个字符串
file_name='demo3.txt'with open(file_name,'w',encoding='utf-8')as file_obj:#write() 向文件写人内容#如果操作的是一个文本文件,write()需要传递一个字符串#操作文件的时候要指定操作的类型#w表示的是可写 使用w写入文件的时候 如果文本不存在会创建文件  如果存在则会覆盖原文件file_obj.write('sdd')file_obj.write('eff')   #这样同时写的时候不会覆盖的file_obj.write('php')file_obj.write(str(66))


file_name='demo3.txt'with open(file_name,'w',encoding='utf-8')as file_obj:#write() 向文件写人内容#如果操作的是一个文本文件,write()需要传递一个字符串#操作文件的时候要指定操作的类型#w表示的是可写 使用w写入文件的时候 如果文本不存在会创建文件  如果存在则会覆盖原文件file_obj.write('sdd\n')file_obj.write('eff\n')   #这样同时写的时候不会覆盖的file_obj.write('php\n')file_obj.write(str(66))

file_name='demo3.txt'with open(file_name,'w',encoding='utf-8')as file_obj:#write() 向文件写人内容#如果操作的是一个文本文件,write()需要传递一个字符串#操作文件的时候要指定操作的类型#w表示的是可写 使用w写入文件的时候 如果文本不存在会创建文件  如果存在则会覆盖原文件#而且这个写入是有返回值的  它返回的是你写入的几个字符file_obj.write('sdd\n')file_obj.write('eff\n')   #这样同时写的时候不会覆盖的file_obj.write('php\n')file_obj.write(str(66))r=file_obj.write(str(66))   若加上/n  即r=file_obj.write(str(66)+\n)print(r)2
file_name='demo3.txt'with open(file_name,'w',encoding='utf-8')as file_obj:file_obj.write('sdd\n')file_obj.write('eff\n')   file_obj.write('php\n')r = file_obj.write(str(66) +'\n')print(r)3

file_name='demo3.txt'# with open(file_name,'w',encoding='utf-8')as file_obj:
with open(file_name,'a',encoding='utf-8')as file_obj:#write() 向文件写人内容#如果操作的是一个文本文件,write()需要传递一个字符串#操作文件的时候要指定操作的类型#w表示的是可写 使用w写入文件的时候 如果文本不存在会创建文件  如果存在则会覆盖原文件#而且这个写入是有返回值的  它返回的是你写入的几个字符file_obj.write('sdd\n')file_obj.write('eff\n')   #这样同时写的时候不会覆盖的file_obj.write('php\n')r = file_obj.write(str(66) +'\n')# print(r)#a表示追加


当然其他的追加 关于open的方法可以去官网查询

8.操作二进制文件

●b 二进制文件
●读二进制文件 rb
写如二进制文件 wb
追加二进制文件 ab 因为二进制文件比较大所以一点一点读



复制一下位置
C:\Users\Administrator\Desktop


file_name=r'C:\Users\Administrator\Desktop\梦境平原.mp3'with open(file_name,'r') as file_obj:print(file_obj.read(100))执行后UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 21: illegal multibyte sequence
UnicodeDecodeError:“gbk”编解码器无法解码位置21中的字节0xff:非法的多字节序列

为什么会报这个错呢 因为这个音乐文件是音频文件 (二进制文件 也就是除了纯文本文件剩的都是二进制文件 )
r 是读取纯文本文件 而rb 读取二进制文件

file_name=r'C:\Users\Administrator\Desktop\梦境平原.mp3'with open(file_name,'rb') as file_obj:#b 二进制文件#读取进制文件是rb  写入二进制文件是wb  追加二进制文件是ab  因为二进制文件比较大所以慢慢读   print(file_obj.read(100))b'ID3\x03\x00\x00\x00\x00\x08\x15TIT2\x00\x00\x00\x0b\x00\x00\x01\xff\xfe\xa6h\x83Xs^\x9fS\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'b就是字节的意思  这个音乐文件都是二进制编码  只不过是以十六进制所表现呈现的
但如大家所看到的读取 打印后确实没什么用  就是上面那一堆

用一个已知的音乐文件 再写入一个与其一样的音乐文件


file_name=r'C:\Users\Administrator\Desktop\梦境平原.mp3'with open(file_name,'rb') as file_obj:#读二进制文件是rb  写如二进制文件是wb  追加二进制文件是ab  因为二进制文件比较大所以一点一点读# print(file_obj.read(100))#定义一个新文件new_name='abc.mp3'with open(new_name,'wb') as new_obj:#定义读取的大小chunk=1024*100while True:content=file_obj.read(chunk)if not content:breaknew_obj.write(content)执行后我们找一下  abc.mp3


右键 Show in Explorer 打开它所在的文件夹
Show in Explorer(在资源管理器中显示)

点击就能播放

python14基础末异常文件相关推荐

  1. 十九. Python基础(19)--异常

    十九. Python基础(19)--异常 1 ● 捕获异常 if VS异常处理: if是预防异常出现, 异常处理是处理异常出现 异常处理一般格式: try: <...............&g ...

  2. Linux删除证书文件命令,Linux基础面面观之文件复制、移动、删除的命令

    用惯Windows的朋友在开始学习Linux时都会觉得在Linux中进行文件的复制.移动和删除工作也是只需点点鼠标或者键盘快捷键就能简单完成,然而事实并没有这么简单.在Linux下进行以上三种操作一般 ...

  3. 【CXY】JAVA基础 之 异常

    讲述: 1.五个关键字 1.try:尝试捕获异常,具体的下面讲述 2.catch:当try捕获到异常了,系统会自动生成一个异常信息,这个异常信息就给catch,形象的说我抓住了这个异常. 3.thro ...

  4. java 抛出异常的作用_Java 基础之异常抛出

    Java 基础之异常抛出 Java,基础,异常抛出 在 Java 里,除了对异常的捕获外,你还可以抛出异常,还可以创造异常.抛出异常的作用就是告诉你的调用者,程序出现了不正常的情况了,得不要期望的结果 ...

  5. Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制)

    原文:Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制) 异常机制和File类 异常机制 基本概念 异常就是"不正常"的含义,在 Java 语言中主要指 ...

  6. Python基础知识点拾遗---文件IO(os、filecmp、shutil库)、sys库、序列化(pickle)、类

    Python基础知识点拾遗 文件IO 文本 目录 os 获取文件的创建.修改及最近访问时间 获取当前文件的大小 获取当前的登录用户名称 获取当前的cpu核数 调用操作系统底层的random生成器 sh ...

  7. C基础——目标代码文件、可执行文件和库

    目标代码文件.可执行文件和库 C编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行的机器语言代码.C分两步完成这一工作:编译和链接.编译器将源代码转换为中间代码,链接器将此中间代 ...

  8. Java基础知识——异常Throwable和Exception

    Java基础知识--异常Throwable和Exception Java设置了异常,旨在鼓励将方法中可能出现的异常告知给使用此方法的程序员(你和我!).当然了,这种方法是比较优雅的,让我们确切的知道是 ...

  9. IOS开发基础之解压缩文件技术

    IOS开发基础之解压缩文件技术 这里我们使用的第三方框架SSZipArchive,第三方依赖libz.tbd 库 ,基于C语言的,加入libz.tbd框架支持. 服务器我们选择是Java Web 的T ...

最新文章

  1. 大数据能力提升项目| 学生成果展系列之二
  2. 【运筹学】线性规划 人工变量法 ( 人工变量法案例 | 第三次迭代 | 中心元变换 | 检验数计算 | 最优解判定 )
  3. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装
  4. mysql源代码安装
  5. 数据库编程——intro to JDBC
  6. String.format() 方法用法解说
  7. python hackrf_HackRF固件更新及编译环境搭建
  8. 浅议组播(一文看懂组播)
  9. linux下copy命令c实现,C语言自己实现linux下cp文件复制命令
  10. c语言考试答案,C语言考试题及答案
  11. Qt 5.9.6 下载及安装
  12. 计算机操作系统之CPU架构和原理(二)
  13. 使用Java解牛客网六一儿童节
  14. 为什么我的微信小程序开发工具调试窗口一片空白?
  15. 简单解释:STM32参考手册的地址偏移和复位值
  16. Docker之介绍与安装
  17. DARTS 可微 架构搜索
  18. jackson 入门
  19. 《薛兆丰经济学讲义》阅读笔记|第一节-真实世界 经济学的视角
  20. Worktile:突围,企业协作办公的主旋律

热门文章

  1. Siri说过的冷笑话
  2. 21年一级造价师通过率仅4%!如何一次通关一级造价师?
  3. 【国六总结】蓝桥杯复习资料(含外设代码)
  4. DevExpress WinForms是一款全球顶级的用户界面控件套包
  5. 金额保留两位小数,金额千分号,文本超出位数变引号方法
  6. ORA-1688: unable to extend table AUDSYS.AUD$UNIFIED
  7. 达梦DM8数据库安装和创建实例
  8. sublime text 3开启vi编辑模式
  9. Win7 2008 禁用IPV6
  10. 关于前端开发:起源、架构、变迁