python基础学习—第10章 文件和异常

10.1 从文件中读取数据

10.1.1 读取整个文件
1.open()函数:
①要以任何方式使用文件,都要先打开文件,才能访问
②open()函数接受一个参数,即要打开的文件的名称
③函数open()返回一个表示文件的对象
2.关键字with
①关键字with在不再需要访问文件后将其关闭
3.方法read()
①使用read()方法读取这个文件的全部内容
②read()到达文件末尾时返回一个空字符串,将这个空字符串显示出来时就是一个空行,删除多出来的空行,可调用rstrip()函数

with open('pi.txt') as file_object:
     contents = file_object.read()
print(contents)

10.1.2 文件路径
1.相对路径
①打开与python程序文件在同一目录的文件
②文件路径相对于当前运行的程序所在目录的
2.绝对路径
①指出希望python到哪里去查找,给出完整的路径,这样就不用关心当前运行的程序存储在什么地方了
②绝对路径要比相对路径要长
③使用绝对路径,可读取系统中任何地方的文件
3.文件路径写法
①在代码中显示文件路径时,要使用斜杠/,而不是反斜杠
②如果一定要使用反斜杠,可对路径中的每个反斜杠都进行转义

C:\\path\\to\\file.txt

10.1.3 逐行读取
1.要以每次一行的方式检查文件,可对文件对象使用for循环

filename = 'pi.txt'
with open(filename) as file_object:
    for line in file_object:
        print(line)

10.1.4 创建一个包含文件各行内容的列表
1.使用关键字with时,open()返回的文件对象只在with代码块内可用,要访问with代码块外的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表
①readlines()方法从文件中读取每一行,并将其存储在一个列表中

filename = 'pi.txt'
with open(filename) as file_object:
	lines = file_object.readlines()
#在with代码块外使用
for line in lines:
	print(line.rstrip())

10.1.5 使用文件的内容

filename = 'pi.txt'
with open(filename) as file_object:
	lines = file_object.readlines()
pi_string= ''
for line in lines:
	pi_string += line.rstrip()
print(pi_string )
print(len(pi_string))

notice:读取文本文件时,python将其中的所有文本都解读为字符串,如果读取的是数,并要将其作为数值使用,就必须使用函数int()将其转换为整数或使用函数float()将其转换为浮点数

10.2 写入文件

10.2.1 写入空文件
1.open()函数提供了两个实参,第一个是打开文件的名称,第二个是以什么模式打开这个文件
2.模式分为:写入模式(‘w’)、读取模式(‘r’)、附加模式(‘a’)、读写模式(‘r+’)
3.如果省略了模式实参,将以默认的只读模式打开
4.如果要写入的文件不存在,函数open()将自动创建它
①要注意的是,如果指定的文件已经存在,python将在返回文件对象前清空该文件的内容
②write()将一个字符串写入文件,不会在写入的文本末尾添加换行符
notice:python只能将字符串写入文本文件,要将数值数据存储在文件文件中,必须先使用函数str()将其转换为字符串格式

filename = 'programming.txt'
with open(filename, 'w') as file_object:
	file_object.write("I love you")

10.2.3 附加文件
1.给文件添加内容,而不是覆盖原有的内容,以附加模式打开文件,且不会清空文件的内容

filename = 'programming.txt'
with open(filename, 'a') as file_object:
	file_object.write("I love you, mom")

10.3 异常

10.3.1 使用try-except代码块

try:
	print(5/0)
except ZeroDivisionError:
	print("You can't divide by zero")

10.3.2 try-except-else代码块
1.使用try-except-else原理:python尝试执行try代码块中的代码,只有可能引发异常的代码才需要放到try语句中,执行成功时运行的代码放在else代码块中,运行try引发指定的异常该怎么办放在except中
10.3.3 静默失败
1.希望程序在发送异常时保持沉默,当作什么都没发送继续运行
2.使用pass语句,可用于让python在代码块中什么都不做,充当占位符

def count_word(filename):
	"""计算一个文件大致包含多少个单词"""
	try:
		--snip--
	expect FileNotFoundError:
		pass
	else:
		--snip--
filenames = ['a', 'b', 'c']
for filename in filenames:
	count_word(filename)

10.4 存储数据

1.模块json能够将简单的python数据结构转储到文件中,并在程序运行时加载该文件中的数据
10.4.1 使用json.dump()和json.load()
1.json.dump()接受两个实参:要存储的数据,以及可用于存储数据的文件对象

import json
numbers = [2, 3, 4, 5]
#指出将该数字列表存储在哪个文件中
filename = 'numbers.json'
with open(filename, 'w') as f:
	#将数字列表存储在文件numbers.json中
	json.dump(numbers, f)

2.json.load():加载存储在文件中的信息

import json
filename = 'numbers.json'
with open(filename) as f:
	numbers = json.load(f)
print(numbers)

10.4.3 重构
1.目的:编写出清晰而易于维护和扩展的代码

import json
def greet_user():
	"""问候用户,并指出其名字"""
	filename = 'username.json'
	try:
		with open(filename) as f:
			username = json.load(f)
	except FileNotFoundError:
		username = input("What's your name?")
		with open(fielname, 'w') as f:
			jsom.dump(username, f)
			print(f"We'll remember you when you come back, {username}")
	else:
		print(f"Welcome back, {username}")
greet_user()

对以上代码进行重构,通过对以上代码进行分析:
可重构为:存储用户就获取、没有存储就提示用户输入用户名、问候用户

import json
def get_stored_username():
	"""如果存储了用户名,就获取它"""
	filename = 'username.json'
	try:
		with open(filename) as f:
			username = json.load(f)
	except FileNotFoundError:
		return None
	else:
		return username
def get_new_username():
	"""提示用户输入用户名"""
	username = input("What's your name?")
		with open(fielname, 'w') as f:
			jsom.dump(username, f)
		return username
def greet_user():
	"""问候用户、并指出其名字"""
	username = get_stored_username()
	if username:
		print(f"Welcome back, {username}")
	else:
		username = get_new_username()
		print(f"We'll remember you when you come back, {username}")
greet_user()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值