python基础9

文件和异常

从文件中读取数据

读取整个文件

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文件中,以及如何让调用其中数据;
  • 最后,最重要的是一种思想或者说一种逻辑:重构。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!