欢迎来到~ 初识Python 系列文章 “第六回”,大家好呀~ 我是 清汉
截至到前五篇文章,Python 的基础语法己基本叙述完毕。
预计还有两篇文章(算上这篇) Python 基础部分的知识就总结叙述完毕了。
基础部分结束后,计划会将本书第二部分的项目实战部分也一一列举出来~
啊~ 我真是个勤勤恳恳的搬运工,哈哈~
不过,可能,应该,后面应该没有太多时间更新了,也可能会更新 Java方面的知识,因为… …
我要去培训班学 Java了~
当然,Python 我也不会拉下,会慢慢的自己啃下来,毕竟多掌握一份技能就多一份机会嘛~
人生苦短,我学Python~
好了,进入下面进入正文
接上回书~
上码🐎,走着~
DIY 6
声明:未打广告,全文知识梳理来源于《Python编程 从入门到实践(第2版)》豆瓣评分9.3
注:例中所有 >>> 符号后为输出结果 - -snip- - 为代码省略位置
知识框图
第10章
文件和异常
文件
- 文本文件可以存储大量的数据,比如电子书籍、测绘数据、经济数据等等… 当我们需要分析或者修改、使用其中的数据时,便需要学会如何对这些数据进行CRUD;
- 下面我们通过几个栗子来了解其中的奥秘 ~
读取文件
例1
- 使用程序读取文件时,会用到一些关键字、函数、方法。下面我们通过“栗子”依次介绍该如何使用这些关键字、函数、方法来做到我们需要的效果。
- 关键字 with 作用是Python 会在不再需要访问文件后将其关闭。
- 函数 open() 打开文件,接受一个参数:要打开文件的名称;下例中的这种直接指定文件名称的一定要跟主程序在同一个目录中。
- 方法 .read() 读取这个文件的全部内容,并将其作为一个字符串赋给变量。且读取到文件末尾时返回一个空字符串,当在控制台打印出来时就是一个空行。所以需采用方法rstrip();
- 方法rstrip() 删除字符串尾部空白
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
读取的文件:
文件路径
例 2
- 文件路径分为相对路径与绝对路径,在读取文件时正确的路径才能找到我们需要读取的文件,错误的格式、错误的写法都会导致Python找不到文件。下面的例子中将介绍两种不同路径的如何读取到文件;
with open('text_files/filename.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
file_path = 'E:/Python/Python-Crash-Course/python0_1/0__1/第一部分/第10章/随笔/text_files/filename.txt'
with open(file_path) as file_object:
contents = file_object.read()
print(contents.rstrip())
逐行读取
例 3
- 当需要对文件进行逐行读取时,可采用for循环遍历文件。
- 由于使用关键字 with 时,open() 返回的文件对象只能在 with 代码块内使用,若是在 with 代码块外使用可将其内容存储到一个列表中,再通过遍历列表即可得到文件内容。
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
使用文件的内容
例 4
- 之所以要读取文件自然是这个文件对我们有用,比如我们要使用文件中的数据作为程序中某个部分的输出。
- 如下例所示:
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
print(f'{pi_string[:10]} ...')
写入文件
例 5
- open() 第一个实参也是要打开的文件名称。如果写入的文件不存在,函数open()会自动创建这个文件。
- open() 第二个实参‘w’告诉 Python ,要以 写入模式 打开这个文件。
- 打开文件时可指定:读取模式‘r’, 写入模式‘w’(python将在返回文件对象前清空文件内容), 附加模式‘a’, 读写模式‘r+’
- 如果省略了模式实参,Python将以默认的只读模式打开文件。
- 方法 .write() 将一个字符串写入到文件中。
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
file_object.write("\nI love creating new games.\n")
写入后的文件:
filename = 'programming.txt'
with open(filename, 'a') as file_object:
file_object.write("I also love finding meaning in large datasets.\n")
file_object.write("I love creating apps that can run in a browser.\n")
将需要写入的内容附加到原文件后:
异常
- 编写代码中若有语法错误,在运行代码的时候程序将会停止并提示 Traceback,其中会包含有关异常的报告。
- 使用 try-except 代码块处理异常, try-except 代码块让 Python 执行指定的操作,同时告诉 Python 出现异常时该怎么办。即使出现异常,程序也将继续运行,并显示你自己编写的提示信息,而不是 Traceback;
使用 try-except 代码块
例 6
- 当你认为可能会发生错误时,可编写一个try-except代码块来处理可能引发的异常。
- 如除法运算若除数为 0 ,则会提示异常为:ZeroDivisionError;例6 中便是以 ZeroDivisionError 作为 except 代码块的异常条件,若 try 代码块中的代码触发了这个异常便会直接运行 except 代码块中的内容。
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
使用异常避免崩溃
例 7
- 比如发生错误时,还有程序的工作尚未完成,这时妥善的处理错误就尤为重要了。
print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
first_number = input("\nFirst number: ")
if first_number == 'q':
break
second_numbers = input("Second number: ")
if second_numbers == 'q':
break
try:
answer = int(first_number) / int(second_numbers)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
代码运行结果:
异常 + 分析文本
例 8
- 读取文件结合异常处理对文件进行分析。合理的使用上述的 try-except 代码块,实际运用到我们日常代码编写中。
- FileNotFoundError 异常的意思是找不到目标文件。
filename = 'E:/Python/Python-Crash-Course/python0_1/0__1/第一部分/第10章/chapter_10/alice.txt'
try:
with open(filename, encoding='utf-8') as f:
contents = f.read()
except FileNotFoundError:
print(f"Sorry, the file {filename} does not exist.")
else:
words = contents.split()
num_words = len(words)
print(f"The file {filename} has about {num_words} words.")
方法 .split() 具体实例:
title = "Alice in wonderland"
list_title = title.split()
print(list_title)
静默失败
例 9
- 有时候当发生异常时并不需要提示什么,我们需要程序保持沉默就像没有发生什么一样接着跑下去。
- pass 语句便可以帮忙实现这种功能,在 try-except 代码块的 except 中直接放入 pass 语句即可。
- 有了 pass 语句,我们就可以决定报告哪些错误了, 嘿嘿~
- 这里就不举具体实例了,有兴趣可以自己敲一下,看看运行效果。
try:
except FileNotFoundError:
pass
存储数据
- 程序中处理数据、收集信息所得到的数据,大多数时候都需要把它存储到文件中,以供下次使用或提供数据可视化。
- 下面几个栗子便是要教会我们如何存储数据。
模块 json
- 模块 json 让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。
例 10
- json.dump() :存储
- json.load() :读取到内存
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'number.json'
with open(filename, 'w') as f:
json.dump(numbers, f)
with open(filename) as f:
numbers_open = json.load(f)
print(numbers_open)
json 模块存储的数据:
保存和读取用户生成的数据
例 11
- 提示用户首次运行程序时输入自己的名字,并在再次运行程序时记住他。
import json
filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
except FileNotFoundError:
username = input("What is your name?\nname: ")
with open(filename, 'w') as f:
json.dump(username, f)
print(f"We'll remember you when you come back, {username}!")
else:
print(f"Welcome back, {username}!")
不存在json文件的情况:
存在josn文件的情况:
重构
例 12
- 重构让代码更清晰、更容易扩展、更易于理解。
- 重构需要保证程序能够正确的运行,合理的划分一系列的具体工作,可以分别打包成不同的函数。
def get_stored_username():
'''如果用户存储了用户名,就获取它'''
filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
except FileNotFoundError:
return
else:
return username
def get_new_username():
'''提示用户输入用户名'''
username = input("What is your name?")
filename = 'username.json'
with open(filename, 'w') as f:
json.dump(username, f)
return username
def greet_user():
'''问候用户,并指出其名字'''
username = get_stored_username()
if username:
print(f"Welcome back, {username}!")
else:
username = get_new_username()
print(f"We'll remember you come back, {username}!")
这里就不运行了,有兴趣的可以自己运行看看~
本篇小结
- 学习了如何使用、读取、写入文件
- 学习了如何处理异常
- 学习了如何存储数据、使用数据
- 学习了如何重构代码
感谢,每一位认真阅读到这里的少侠!来个手滑三联吧,不迷路~
下期见,等你哟~
|