相关文章链接:
python编程从入门到实践第七章——用户输入和while循环
10.1 从文件中读取数据
可以一次性读取文件的全部内容,也可以每次一行的方式逐步读取。
10.1.1 读取整个文件
要读取文件,需要一个包含几行文本的文件。
pi_digits.txt:
3.1415926535
8979213846
2643383279
下面的程序打开并读取这个文件,再将其内容显示到屏幕上:
with open('pi_digits.exe') as file_object:
contents = file_object.read()
print(contents)
#3.1415926535
8979213846
2643383279
要以任何方式使用文件,哪怕仅仅是打印其内容,都得先打开文件,才能访问它。函数open()接受一个参数:要打开的文件的名称。Python在当前执行的文件所在目录中查找指定的文件。函数open()返回一个表示文件的对象。
关键字with在不再需要访问文件后将其关闭。如果在程序中过早调用close(),你会发现需要使用文件时它已关闭(无法访问),这会导致更多的错误。但通过前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。
使用read()方法读取这个文件的全部内容,并将其作为一个长长的字符串赋给变量contents。
使用read()到达文件末尾返回一个空字符串,而将空字符串显示出来时就是一个空行。要删除多出来的空行,可在函数调用print()中使用rstrip()。Python方法rstrip()删除字符串末尾的空白。
10.1.2 文件路径
要让Python打开不与程序文件位于同一个目录中的文件,需要提供文件路径,让Python到系统的特定位置去查找。
with open('text_file/filename.txt') as file_object:
这行代码让Python到文件夹python_work下的文件夹text_files中去查找指定的.txt文件。
注意:显示文件路径时,Windows系统使用反斜杠(\)而不是斜杆(/),但在代码中依然可以使用斜杆。
还可以将文件在计算机中的准确位置告诉Python,这样就不用关心当前运行的程序存储在什么地方,这称为绝对文件路径。
绝对路径通常比相对路径长,因此将其赋值给一个变量,再将变量传递给open()会有所帮助。
file_path = '/home/ehmattes/other_files/txt_files/filename.txt'
with open(file_path) as file_object:
通过使用绝对路径,可读取系统中任何地方的文件。
10.1.3 逐行读取
要以每次一行的方式检查文件,可对文件对象使用for循环:
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
#3.14159265353
# 8979323846
# 2643383279
打印每一行时,发现空白行更多了:要消除这些空白行,可在函数调用print()中使用rstrip()。
10.1.4 创建一个包含文件内各行内容的列表
使用with关键字时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储到一个列表中,并在with代码块外使用该列表:可以立即处理文件的各个部分,也可以推迟到程序后面再处理。
filename = 'pi_digitis.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
readlines()从文件中读取每一行,并将其存储在一个列表中。
10.2 写入文件
保存数据的最简单的方式之一是将其写入文件中。
10.2.1 写入空文件
filename = 'programming.txt'
with open(filename,'w') as file_object:
file_object.write("I love programming")
调用open()时提供了两个实参。第一个实参也是要打开的文件的名称。第二个实参(’w')告诉python,要以写入模式打开这个文件。打开文件时,可指定读取模式('r’)、写入模式(‘w')、附加模式(’a')或读写模式(‘r+’)。如果省略了模式参数,Python将默认的只读模式打开文件。
如果写入的文件不存在,函数open()将自动创建它。然而,以写入模式(‘w')打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件的内容。
注意:Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。
10.2.2 写入多行
函数write()不会在写入的文本末尾添加换行符,因此写入多行时需要指定换行符。
10.2.3 附加到文件
附加模式打开文件,以附加模式打开文件时,Python不会返回文件对象前清空文件的内容,而是将写入文件的行添加到文件末尾。如果指定的文件不存在,Python将创建一个空文件。
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 ceating apps that can run in browser.\n")
10.3 异常
Python使用称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理异常的代码,程序将继续运行;如果未对异常进行处理,程序将停止并显示traceback,其中包含有关异常的报告。
10.3.1 处理ZeroDivisionError异常
不能用数除以0
print(5/0)
#Traceback(most recent call last):
# File "division_caculator.py",line 1,in <module>
# print(5/0)
#ZeroDivisionErreor : division by zero
10.3.2 使用try—except代码块
处理ZeroDivisionError异常的try-except代码块类似于以下方式:
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
#You can't divide by zero!
如果try代码块中的代码运行起来没有问题,Python将跳过except代码块;如果try代码块中的代码导致了错误,Python将查找与之匹配的except代码块并运行其中的代码。
10.3.4 else代码块
依赖try代码块成功执行的代码都应放到else代码块中:
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_number = input("Second number:")
if second_number == 'q':
break
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
10.3.5 处理FileNotFoudError
使用文件时,一种常见问题:查找的文件可能在其他地方,文件名可能不正确,或者这个文件根本就不存在。
filename = 'Alice.txt'
with open(filename,encoding = 'utf-8') as f:
contents = f.read()
使用变量f来表示文件对象;给参数encoding指定了值,在系统的默认编码与要读取文件使用的编码不一致时,必须这样做。
10.3.6 分析文本
方法split(),它能根据一个字符串创建一个单词列表。
title = "Alice in Wonderland"
title.split()
#['Alice','in','Wonderland']
方法split()以空格为分隔符将字符串拆分成多个部分,并将这些部分都存储到一个列表中。结果是一个包含字符串中所有单词的列表。
使用try—except代码块提供了两个重要的优点:避免用户看到traceback,以及让程序继续分析能够找到的其他文件。
10.3.8 静默失败
并非每次捕获到异常都需要告诉用户,有时候你希望程序在发生异常时保持静默,就像什么都没有发生一样继续运行。要让程序静默失败,可像通常那样编写try代码块,但在except代码块中明确地告诉Python什么都不要做,即使用pass语句。
pass语句充当了占位符,提醒你在程序的某个地方什么都没有做,并且以后也要在这里做些什么。
10.4 存储数据
使用json来存储数据。模块json让你能够将简单的python数据结构转储到文件中,并在此程序再次运行时加载该文件中的数据。
10.4.1 使用json.dump()和json.load()
使用json.dump()来存储这组数,而第二个程序将使用json.load().
函数json.dump()接受两个实参:要存储的数据,以及可用于存储数据的文件对象。
import json
number = [2,3,5,7,11,13]
filename = 'number.json'
with open(filename,'w') as f:
json.dump(numbers, f)
#[2,3,5,7,11,13]
先导入模块json,再创建一个数值列表。指定了要将该数字列表存储到哪个文件中。通常使用文件拓展名.json来指出文件存储的数据为JSON格式。
使用json.load()将列表读取到内存中:
import json
filename = 'number.json'
with open(filename) as f:
numbers = json.load(f)
print(number)
#[2,3,5,7,11,13]
使用函数json.load()加载存储在number.json中的信息,并将其赋值给变量numbers。
10.4.2 保存和读取用户生成的数据
使用json保存用户生成的数据大有裨益,因为如果不以某种方式存储,用户的信息会在程序停止运行时丢失。
10.4.3 重构
代码能够正确地运行,但通过将其划分为一系列完成具体工作的函数,还可以改进。这样的过程称为重构。重构让代码更清晰、更易于理解、更容易扩展。