文件和异常
从文件中读取数据
读取整个文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| with open('python.txt') as file_project: """处于同一目录下的文件的打开方式""" contents = file_project.read() print(contents)
with open("txt\python.txt") as file_project: """ 相对路径 该python文件目录下的文件夹中的文件的打开方式 """ contents = file_project.read() print(contents)
with open("E:\python_work\jichu\python.txt") as file_project: """ 绝对路径:任何位置文件都可以使用 """ contents = file_project.read() print(contents)
|
使用with open()
而非open()
函数的目的在于让计算机决定何时关闭文档,否则一直保持文档的打开会影响性能。
逐行读取
1 2 3 4 5 6 7 8 9 10 11 12
| with open (filename) as file_project: """逐行读取文件""" for line in file_project: print(line.rstrip())
with open('python.txt') as file_project: """逐行读取数据并生成列表""" lines = file_project.readlines()
for line in lines: print(line.rstrip())
|
分析文本
1 2 3 4 5 6 7 8 9 10
| filename = 'python.txt'
with open(filename) as file_obj: contents = file_obj.read()
words = contents.split() """分割文档内容为由每个单词组成的列表""" num_words = len(words) print(words) print("This file is " + num_words + " words.")
|
处理多个文件
思路:使用函数或者创建文件类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| def count_words(filename): """使用函数统计文件字数"""
try: with open(filename) as f_obj: contents = f_obj.read() except FileNotFoundError: msg = "Sorry,this file does not exit" print(msg) else: words = contents.split() num_words = len(words)
print(filename + " has " + str(num_words) + " words.")
filenames = ['pthon.txt', 'python.txt', 'pythons.txt'] for filename in filenames: count_words(filename)
|
将数据写入文件
保存数据的最简单的方式之一就是将其写入文件中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| filename = 'programing.txt'
with open(filename, 'w') as file_object: """ 将数据写入文件 若文件不存在,则自动创建 """ file_object.write("I love programing.\n") file_object.write("I love python.\n")
with open(filename, 'a') as file_object:
file_object.write("I love python too.\n")
|
- ‘w’(写入模式)、’r’(只读模式)
- ‘a’(附加模式)、’r+’(读取和写入)
- 谨慎使用写入模式(‘w’),每次写入都会先清空文件
- 写入多行时要注意在需要换行的文本后加换行符\n
- 最好在最后一行也加入换行符,以便下次写入
- python只能将字符串写入文本,其他格式需使用str()转换
处理异常
python使用被称为异常的特殊对象来管理程序执行期间发生的错误。
每当发生让python不知所措的错误时,它都会创建一个异常对象。
如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止运行,并显示traceback
。
异常是使用trace-except
代码块处理的。
python的错误处理结构让你能够细致地控制与用户分享错误信息的程度,要分享多少信息由你决定。
比如0不能做除数,否则报错。
1 2 3
| print(2/0) """----------------------------""" ZeroDivisionError: division by zero
|
我们可以对该错误做如下处理:
1 2 3 4 5 6
| try: print(2/0) except ZeroDivisionError: print("You can't divide by zero!") """---------------------------------""" You can't divide by zero!
|
通常我们将容易引发错误的代码放到try-except
代码块中,可提高这个程序低于错误的能力。
以下为完整的错误处理流程:
1 2 3 4 5 6 7 8
| first_num = input('first number:') last_num = input('last number:') try: divide_num = int(first_num) / int(last_num) except ZeroDivisionError: print("You can't divide by zero!") else: print(divide_num)
|
存储数据
很多程序都要求用户输入某种信息,然后程序将用户提供的信息存储在列表和字典等数据结构中。用户关闭程序时,你几乎总是要保存他们提供的信息;一种简单的方式是使用json模块来存储数据。
模块json让你能够将简单的python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。你还可以使用json在python程序之间分享数据,更重要的是与使用其他编程的人员分享数据。
JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括python在内的众多语言使用。
使用JSON
我们来编写一个存储一组数字的简短程序,再编写一个将这些数字读取到内存中的程序。第一个程序使用json.dump()
来存储数字,第二个程序使用json.load()
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import json
numbers = [1, 2, 3, 4, 5]
filename = 'number.json' with open(filename, 'w') as f_obj: """自动创建文件并保持写入""" json.dump(numbers, f_obj)
with open(filename) as f_obj: numbers = json.load(f_obj)
print(numbers)
|
- 使用
json.dump()
需使可存储数据的文件保持写入或附加的状态;使用json.load()
只需保持文件处于打开状态即可;
- 保存数据使用
json.dump()
,使用数据使用json.load()
;
- json.dump()需要指定两个参数:要存储的数据与可用于存储数据的文件;
重构
重构不是一个方式而是一种思维。
重构指的是将一段不完善可能出错的程序,通过判断语句来尽可能的完善,以应对各种不同的情景,保证程序的运行的同时使程序更加美观,可理解。
比如下面的一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import json
def greet_user(): """问候用户并显示其姓名""" filename = 'username.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: username = input("What is your name?") with open(filename, 'w') as f_obj: json.dump(username, f_obj) print("We'll remember your name, " + username + '!') else: print("Wellcome back, " + username + "!")
greet_user()
|
虽然以上程序代码注释为问候用户,但是,事实上,该程序不仅包括问候用户,还包括当用户名不存在时,输入新的用户名。
下面重构该程序,使其不再执行众多任务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| def get_stored_name(): """如果存储了用户名,就获取它""" filename = 'username.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: return None else: return username
def get_new_name(): """如果没有存储用户名,提示输入它""" username = input("What is your name?") filename = 'username.json' with open(filename, 'w') as f_obj: json.dump(username, f_obj) return username
def greet_user(): """问候用户""" username = get_stored_name() if username: print("Welcome back " + username + "!") else: username = get_new_name() print("We'll remember you, " + username + "!")
greet_user()
|
小结
本节学习了以下主要内容:
- 如何打开txt文件,以及将数据存储在其中;
- 如何处理异常,避免程序崩溃;
- 如何转储数据到json文件中,以及如何让调用其中数据;
- 最后,最重要的是一种思想或者说一种逻辑:重构。