十、文件和异常

1. 从文件中读取数据

  • 读取文本文件时,Python 将所有文本解读为字符串
  • 若要将读取的数字作为数值使用,必须使用函数 int() 或 float() 将其转换为整数或浮点数

(1) 读取整个文件

# open() 返回一个表示文件的对象
# 关键字 with 在不再需要访问文件后将其关闭,也可以通过调用 close() 来关闭
# 文件可使用绝对或相对路径,Linux 或 OS X 中使用斜杠(/),而 Windows 中使用反斜杠(\)
# - with open('/home/text_files/pi_digits.txt') as file_object:
# - with open('text_files\pi_digits.txt') as file_object:
with open('pi_digits.txt') as file_object:
# read() 读取文件的全部内容,并返回相应的字符串
    contents = file_object.read()
    print(contents)
    
=>

# 比原始文件末尾多一个空行,是因为 read() 到达文件末尾时返回一个空字符串,可以在 print 语句中使用 rstrip() 将其去除
3.1415926535
  8979323846
  2643383279
  

(2) 逐行读取

filename = ‘pi_digits.txt’

with open(filename) as file_object:
    for line in file_object:
        print(line)
        
=>

# 文件每行末尾都有一个看不见的换行符,print 也会加上一个换行符,因此每行末尾都有两个换行符,所以出现了这些空白行
3.1415926535

  8979323846

  2643383279

(3) 创建一个包含文件各行内容的列表

filename = ‘pi_digits.txt’

with open(filename) as file_object:
# readlines() 从文件中读取每一行 ,并将其存储在一个列表中
    lines = file_object.readlines()
    
for line in lines:
    print(line.rstrip())

2. 写入文件

(1) 写入空文件

filename = 'programming.txt'

# open() 的第二个参数指定打开模式
# - r:只读模式(默认)
# - w:写入模式
# - a:附加模式
# - r+:读取和写入模式
# 
# 若要写入的文件不存在,open() 将自动创建它;若已存在,将在返回文件对象前清空该文件
with open(filename, 'w') as file_object:
# Python 只能将字符串写入文本文件,若要存储数值数据,须先使用 str() 将其转为字符串格式
# write() 不会自动在写入的文本末尾添加换行符,可以手动添加(还可以使用空格、制表符和空行来设置输出的格式)
    file_object.write('I love programming.\n')
    file_object.write('I love creating new games.\n')
    
=>

programming.txt 文件内容:
	I love programming.
	I love creating new games.

(2) 附加到文件

filename = 'programming.txt'

# 使用附加模式打开
# 若指定文件不存在,Python 将创建一个空文件
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')
    
=>

programming.txt 文件内容:
	I love programming.
	I love creating new games.
# 在文件末尾添加内容,而不是覆盖
	I  also love finding meaning  in large datasets.
	I love creating apps that can run  in a browser.

3. 异常

异常是管理程序执行期间发生的错误的特殊对象

  • 异常被处理,程序将继续运行(继续运行 try 之后的代码,try 代码块内剩余代码不会运行);否则停止,并显示一个Traceback
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("\nSecond number: ")
    if second_number == 'q':
        break
# 应该将只可能引发异常的代码放在 try 语句中
    try:
        answer = int(first_number) / int(second_number)
# 可根据 Traceback 获取异常类型,如除0异常的 Traceback 会提示“... ZeroDivisionError: division  by zero”
# except 代码块中可以使用 pass 语句(只填写“pass”即可),将会在异常发生时没有任何输出,包括 Traceback
# - pass 还充当了占位符,提醒你在该位置什么都没有做,且以后也许要在这里做些什么
    except ZeroDivisionError:
        print("You can't division by 0!")
# else 代码块可以没有,即只使用 try-except
# 依赖于 try 代码块成功执行的代码都应放到 else 代码块中
    else:
# 若置于 try 代码块中,效果一致
        print(answer)

4. 存储数据

重构:将代码划分为一系列完成具体工作的函数的过程

# 需要先导入模块 json
import json

def get_stored_username():
    """如果存储了用户名,就获取它"""
# 使用扩展名为 .json 的文件
    filename = 'username.json'
    try:
# 以读取模式打开
        with open(filename) as file_object:
# json.load() 方法将文件数据读取到内存中
            username = json.load(file_object)
    except FileNotFoundError:
            return None
    else:
            return username
            
def get_new_username():
    """提示用户输入用户名"""
    username = input("What is your name?")
    filename = 'username.json'
# 以写入模式打开
    with open(filename, 'w') as file_object:
# json.dump() 方法将数据存储到文件中
        json.dump(username, file_object)
    return username
    
def greet_user():
    """问候用户,并指出其名字"""
    username = get_stored_username()
# if None: False
    if username:
        print("Welcome back, " + username + "!")
    else:
        username = get_new_username()
        print("We'll remember you when you come back, " + username + "!")
        
greet_user()


=>


username.json 文件内容:
"Sally"


控制台输出:
- 首次运行:
  What is your name?Sally
  We'll remember you when you come back, Sally!

- 非首次运行:
  Welcome back, Sally!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,异常处理是一种处理程序运行时错误的机制。当程序出现错误时,Python 解释器会抛出一个异常,如果不做任何处理,程序将会停止运行。因此,通过异常处理,我们可以在程序出错时,使程序继续运行,或者输出有用的信息提示用户。 下面是一个简单的例子: ```python try: num1 = int(input("请输入一个整数: ")) num2 = int(input("请再输入一个整数: ")) result = num1 / num2 print("两数相除的结果为:", result) except ZeroDivisionError: print("除数不能为零") except ValueError: print("请输入一个整数") ``` 在上面的例子中,我们使用了 try-except 语句来捕获可能发生的异常。如果 try 语句块中的代码运行正常,那么 except 语句块将被跳过;否则,如果 try 语句块中的代码出现异常,那么 except 语句块将会被执行。 在上面的例子中,我们使用了两个 except 语句块来分别处理可能发生的两种异常:除数为零和输入不是整数。如果程序出现这两种异常中的任意一种,相应的 except 语句块将会被执行。 除了使用 except 语句块来捕获异常,我们还可以在 try-except 语句中使用 else 和 finally 语句块。其中,else 语句块用于处理在 try 语句块中没有出现异常时需要执行的代码,而 finally 语句块用于处理无论 try 语句块中是否出现异常都需要执行的代码。 下面是一个更加复杂的例子: ```python import os try: file = open("test.txt", "r") content = file.read() print(content) except FileNotFoundError: print("文件不存在") else: print("文件读取成功") file.close() finally: if os.path.exists("test.txt"): os.remove("test.txt") print("文件删除成功") ``` 在上面的例子中,我们首先尝试打开一个名为 test.txt 的文件,如果文件不存在,则会抛出 FileNotFoundError 异常。如果文件存在,则会读取文件内容,并输出到屏幕上。如果文件读取成功,则会关闭文件。最后,我们使用 finally 语句块来确保文件被删除,无论程序是否出现异常。如果文件删除成功,则会输出相应的提示信息。 总之,异常处理是一种重要的编程技术,它可以帮助我们处理程序运行时可能出现的错误,使程序更加健壮和稳定。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值