文件和异常

本节课可以学习处理文件,让程序能快速分析大量的数据;你将学习错误处理,避免程序在面对意外情况时崩溃;
	学习异常,它们时Python创建的特殊对象,用于管理程序运行时出现的错误;你还将学习 模块json,它让你能够保存用户数据,一面再重新停止运行后丢失。

从文件中读取数据

读取整个文件

⭐️文件夹中创建一个txt文本文件,在使用open()函数去打开一个文件,,如果时在同一个目录,就不需要绝对路径。
⭐️with只有特定场合下才能使用。这个特定场合只的是那些支持了上下文管理器的对象
⭐️使用with后不管with中的代码出现什么错误,都会进行对当前对象进行清理工作
⭐️其实还有个close()函数时用来关闭文件的,但是如果过早或者不按规则来关闭文件,可能造成文件的损毁,或者丢失。但是Python它可以自己判断在合适的时候自动将其关闭
⭐️read()函数用来读取文本文档

:oneL 我创建一个圆周率的文本文件,随后在demo文档中打开

### PI_file.txt文件中
3.14159
  26535 
  89793 
  23846
  
  
###file_demo.py文件中
##使用open加绝对路径打开文件,
with open('C:\/Users\/tanchang\Desktop\python\code\PI_file.txt') as file_object:
    ## 把文件中read()函数读取传入txt变量中
    txt = file_object.read()
    ##输出
    print(txt)

##也可以使用相对路径执行结果一样
with open('code\PI_file.txt') as file_object:
    txt = file_object.read()
    print(txt.rstrip())

##输出
3.14159 
  26535 
  89793 
  23846 

逐行读取

⭐️有时候你可能要查看一个文件的特定的数据,或者要以某种方法修改文件中的文本
1️⃣我们在以圆周率文本为列,逐行读取它的数据

##逐行读取
with open('code\/file\PI_file.txt') as file_object:
    txt = file_object
    ##使用for循环遍历
    for i in txt:
        print(i)

      
###执行
3.14159

----------------------------------------
  26535

----------------------------------------
  89793

----------------------------------------
  23846
  

  
##加入raed()函数在试一下
##逐行读取----逐个读取
with open('code\/file\PI_file.txt') as file_object:
    txt = file_object.read()
    for i in txt:
        print('----------------------------------------')
        print(i)

      
##执行
----------------------------------------
3
----------------------------------------
.
----------------------------------------
1
----------------------------------------
4
----------------------------------------
1
----------------------------------------
5
----------------------------------------
9
----------------------------------------


----------------------------------------

----------------------------------------

----------------------------------------
2
----------------------------------------
6
----------------------------------------
5
----------------------------------------
3
----------------------------------------
5
----------------------------------------

----------------------------------------


----------------------------------------

----------------------------------------

----------------------------------------
8
----------------------------------------
9
----------------------------------------
7
----------------------------------------
9
----------------------------------------
3
----------------------------------------

----------------------------------------


----------------------------------------

----------------------------------------
 
----------------------------------------
2
----------------------------------------
3
----------------------------------------
8
----------------------------------------
4
----------------------------------------
6

创建一个包含文件各行的列表

⭐️使用 with关键字时,open()返回的文件对象只存储在 with代码块内可用,如果你要全局可用,就可以使用 readlines()函数,他会把文件的各行一个一个存储到一个列表中,这样就可以在 with代码块外访问它了

##把函数名赋给变量
filename = 'code/file/PI_file.txt'

with open(filename) as file_object:
    ##将文件一行一行加入列表
    file_lines = file_object.readlines()
print(file_lines)
##遍历列表
for i in file_lines:
    print(i)
  
  
###执行
['3.14159\n', '  26535 \n', '  89793 \n', '  23846']
3.14159

  26535

  89793

  23846

使用文件内容

⭐️我们可以将文件读取到内存中,读取到内存中就可以使用任何方式来使用这些数据了
rstrip()函数用来删除空格

##创建一个空字符串,将文件中的内容加入空字符串,但是不能包含任何空格
##使用文件的内容
filename = 'code/file/PI_file.txt'
with open(filename) as file_object:
    file_lines= file_object.readlines()
pi_string = ''
for i in file_lines:
    pi_string += i.rstrip()

print(pi_string)
print(len(pi_string))


##执行
3.14159  26535  89793  23846
28

包含一百万位的大型文件

⭐️如果我把圆周率提升到1000000位,我也可以创建一个空字符串任何把它们加进去

##PI_big_file.txt
##小数点的100000位
3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280 34825 34211 ......

###
###包含圆周率100000位的大型文件
##文件名-文件路径
filename = 'C:\/Users\/tanchang\Desktop\python\code\/file\PI_big_file.txt'
with open(filename) as file_object:
    ##把文件有一行一行加入列表
    file_lines = file_object.readlines()

##定义一个空字符串
pi_str = ''
for i in file_lines:
    pi_str += i.rstrip()
print(pi_str[:46])
##由于我是在百度复制过来有空格,使用计算总长的时候不对
print(len(pi_str))

##执行
3.14159 26535 89793 23846 26433 83279 50288 41
120001

判断圆周率中是否有你的生日的数字

##判断你的生日是否存在于圆周率中
filename = 'C:\/Users\/tanchang\Desktop\python\code\/file\PI_big_file.txt'
##定义一个空的字符串
pi_str = ''
with open(filename) as file_object:
    ##直接把文件里的东西赋字符串
    pi_str += file_object.read()


birthday = input("请输入你的生日:")
if birthday in pi_str:
    print("这里面包含你的生日!")
else:
    print("这里面不包含你的生日!")


##执行
请输入你的生日:214
这里面包含你的生日!

请输入你的生日:123145151
这里面不包含你的生日!

Python学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python知识,其中每一行都以“In Python you can”打头。将这个文件命名为learning_python. txt,并将其存储到为完成本章练习而编写的程序所在的目录中。编写一个程序,它读取这个文件,并将你所写的内容打印三次:第一次打印时读取整个文件;第二次打印时遍历文件对象;第三次打印时将各行存储在一个列表中,再在 with 代码块外打印它们。

##错误的
filename = 'code\/file\learning_python.txt'
with open(filename) as lear_python:
    lear_python_lines_0 = lear_python.read()
    """1)打印整个文件"""
    print(lear_python_lines_0)
    """2)遍历文件对象"""
    for i in lear_python:
        print(i)
    lear_python_lines_2 = lear_python.readlines()
"""3)存储在列表中打印"""
print(lear_python_lines_2)



###正确的
filename = 'code\/file\learning_python.txt'
with open(filename) as lear_python:
    """第一次输出"""
    lear_python_0 = lear_python.read()
    print(lear_python_0)
print('------')
with open(filename) as lear_python:
    """第二次输出"""
    for i in lear_python:
        print(i)
print('------')
with open(filename) as lear_python:
    """第三次输出"""
    lear_python_1 = lear_python.readlines()
for i in lear_python_1:
    print(i)

  
###执行
In Python you can tuple
In Python you can list
In Python you can function
In Python you can cycle
In Python you can dict
In Python you can open file
In Python you can type

------
In Python you can tuple

In Python you can list

In Python you can function

In Python you can cycle

In Python you can dict

In Python you can open file

In Python you can type

------
In Python you can tuple

In Python you can list

In Python you can function

In Python you can cycle

In Python you can dict

In Python you can open file

In Python you can type

使用 replace()把上个文档中中的python替换为C

filename = 'code\/file\learning_python.txt'
with open(filename) as lear:
    lear_lines= lear.read()
print(lear_lines.replace('Python', 'C'))

##执行
In C you can tuple
In C you can list
In C you can function
In C you can cycle
In C you can dict
In C you can open file
In C you can type

写入文件

写入空文件,多行文件,附加到文件

⭐️ open()函数提供了两个实参,一个是文件名,一个是写入模式,写入模式有 r读取模式,w写入模式,a附加模式,r+可读可写模式,如果你没有打这个,那默认就是 r
1️⃣ write()函数写入

##写入空文件
filename = 'code/file/love_linux.txt'
with open(filename,'w') as love_linux:
    love_linux.write('linux is lova liunx')
  
###执行
###会发现在code/file目录下多了个love_linux.txt文档
##多行文件
##写入多行空文件
filename = 'code/file/love_linux.txt'
with open(filename,'w') as love_linux:
    love_linux.write('linux is lova liunx.\n')
    love_linux.write('Python love python.\n')



##执行
linux is lova liunx.
Python love python.


##追加多行空文件
filename = 'code/file/love_linux.txt'
with open(filename,'a') as love_linux:
    love_linux.write('linux is lova liunx.\n')
    love_linux.write('Python love python.\n')
  
##执行
linux is lova liunx.
Python love python.
linux is lova liunx.
Python love python.

10-3访客:编写一个程序,提示用户输入其名字;用户作出响应后,将其名字写入到文件guest.txt 中。

# 10-3访客:编写一个程序,提示用户输入其名字;用户作出响应后,将其名字写入到文件guest.txt 中。
filename = 'code/file/guest.txt'
with open(filename,'a') as guest_name:
    guest_name.write(input("输入用户的名字:"))

10-4访客名单:编写一个while循环,提示用户输入其名字。用户输入其名字后,在屏幕上打印一句问候语,并将一条访问记录添加到文件guest_book.txt 中。确保这个文件中的每条记录都独占一行。

filename='code/file/guest_book.txt'
with open(filename,'w') as guest_book_name:
    ##把循环定义为一直循环
    while True:
        ##把输入的参数
        data = input('输入用户的名字:')
        if data  == 'q':
            break
        else:
            guest_book_name.write(data+'\n')

10-5关于编程的调查:编写一个while循环,询问用户为何喜欢编程。每当用户输入一个原因后,都将其添加到一个存储所有原因的文件中。


错误和异常

异常

⭐️python 有两种错误很容易辨认:语法错误和异常
⭐️当发生 python不知所措的错误是,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你没有对异常进行出合理程序就会停止,并显示一个 traceback,其中包含有关异常的报告。
⭐️异常是使用 try-except代码块处理的。try-except代码块让 Python执行指定的操作,同时告诉 Python发生异常时怎么办。使用了 try-except代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的 traceback

处理ZeroDivisionError异常

1️⃣ 使用 python将一个数整除0试一下,可以看见会显示一个 Tracebackpython也无法使用数字除以0,这里的 ZeroDivisionError就表示是异常对象

print(5/0)

##执行
Traceback (most recent call last):
  File "c:/Users/tanchang/Desktop/python/code/error_demo.py", line 14, in <module>
    print(5/0)
ZeroDivisionError: division by zero

使用try-except代码块

1️⃣ 假如你认为可可能会发生错误时,就可以编写一个 try-excep贴代码块来处理可能引发的异常。

try:
    print(5/0)
except ZeroDivisionError:
    print('不能除以0!!!')
  
##执行
不能除以0!!!

使用else语句

print('输入两个数算出它们相除的商:')
print('请输入:')
while True:
    first_name = input("输入被除数:")
    if first_name == 'q':
        break
    last_name = input("输入除数:")
    if first_name == 'q':
        break
    print("first_name: "+first_name)
    print("last_name: "+last_name)
    try:
        business = int(first_name) / int(last_name)
    except ZeroDivisionError:
        print("除数不能为0")
    else:
        print(business)
  
  
###执行
输入两个数算出它们相除的商:
输入被除数:5
输入除数:0
first_name: 5
last_name: 0
PS C:\Users\tanchang\Desktop\python> & "C:/Program Files/python/python.exe" c:/Users/tanchang/Desktop/python/code/error_demo.py
输入两个数算出它们相除的商:
请输入:  
输入被除数:5
输入除数:0
first_name: 5
last_name: 0 
除数不能为0  
输入被除数:6
输入除数:1
first_name: 6
last_name: 1
6.0
输入被除数:q

处理FileNotFoundError异常

FileNotFoundError异常时找不到文件