python编程从入门到实践第十章——文件和异常

相关文章链接:

python编程从入门到实践第二章——变量和简单数据类型

python编程从入门到实践第三章——列表简介

python编程从入门到实践第四章——操作列表

python编程从入门到实践第五章——if语句

python编程从入门到实践第六章——字典

python编程从入门到实践第七章——用户输入和while循环

python编程从入门到实践第八章——函数

python编程从入门到实践第九章——类

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 重构

代码能够正确地运行,但通过将其划分为一系列完成具体工作的函数,还可以改进。这样的过程称为重构。重构让代码更清晰、更易于理解、更容易扩展。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白天数糖晚上数羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值