[python从入门到实践] chap10 文件和异常

1从文件中读取数据

文件路径
Python在当前执行的文件所在的目录中查找指定的文件。

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

open(‘pi_digits.txt’)返回一个表示文件pi_digits.txt的对象
你只管打开文件,并在需要时使用它,Python自会 在合适的时候自动将其关闭。
我们使用方法**read()**读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量contents中。这样,通过打印contents 的值,就可将这个文本文件的全部内容显示出来
read()到达文件末尾时返回一个空字符串print(contents.rstrip())

ith open('text_files/filename.txt') as file_object:

这行代码让Python到文件夹python_work下的文件夹text_files中去查找指定的.txt文件。

file_path = '/home/ehmatthes/other_files/text_files/filename.txt'
with open(file_path) as file_object:
逐行读取
filename = 'pi_digits.txt'
with open(filename) as file_object: 
	for line in file_object:
		print(line)
		print(line.rstrip())   #消除空白行
filename = 'pi_digits.txt'
with open(filename) as file_object:
	lines = file_object.readlines() 
for line in lines:
	print(line.rstrip())
filename = 'pi_30_digits.txt'
with open(filename) as file_object: 	
	lines = file_object.readlines()

pi_string = ''
for line in lines:
	pi_string += line.strip()   #删除左空格
print(pi_string) 
print(pi_string[:52] + "...")   #处理任意的数据量
print(len(pi_string))

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

2写入文件

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

第一个实参也是要打开的文件的名称;
第二个实参(‘w’)告诉Python,我们要以写入模式打开这个文件。
打开文件时,可指定读取模 式(‘r’)写入模式(‘w’)附加模式(‘a’)或让你能够读取和写入文件的模式(‘r+’)
如果你省略了模式实参,Python将以默认的只读模式打开文件。
如果你要写入的文件不存在,函数open()将自动创建它。
然而,以写入(‘w’)模式打开文 件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件
Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数 str()将其转换为字符串格式。

需要在write()语句中包含换行符

file_object.write("I love programming.\n") 
file_object.write("I love creating new games.\n")
附加模式‘a’

你以附加模式 打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。

3异常

当你认为可能发生了错误时,可编写一个try-except代码块来处理可能引发的异常。

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

我们将导致错误的代码行print(5/0)放在了一个try代码块中。如果try代码块中的代码运行 起来没有问题,Python将跳过except代码块;如果try代码块中的代码导致了错误,Python将查找 这样的except代码块,并运行其中的代码,即其中指定的错误与引发的错误相同。

程序崩溃可不好,但让用户看到traceback也不是好主意。不懂技术的用户会被它们搞糊涂, 而且如果用户怀有恶意,他会通过traceback获悉你不希望他知道的信息。例如,他将知道你的程 序文件的名称,还将看到部分不能正确运行的代码。有时候,训练有素的攻击者可根据这些信息 判断出可对你的代码发起什么样的攻击。

try-except-else代码块

工作原理大致如下:Python尝试执行try代码块中的代码;只有可 能引发异常的代码才需要放在try语句中。有时候,有一些仅在try代码块成功执行时才需要运行 的代码;这些代码应放在else代码块中。except代码块告诉Python,如果它尝试运行try代码块中 的代码时引发了指定的异常,该怎么办。

word_count.py
:# 计算文件大致包含多少个单词 
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) +
" words.")
pass
try:
	--snip--
except FileNotFoundError:
	pass
else:
    --snip--

4 存储数据

JSON(JavaScriptObjectNotation)格式最初是为JavaScript开发的,但随后成了一种常见 格式,被包括Python在内的众多语言采用。

import json
numbers = [2, 3, 5, 7, 11, 13]

filename = 'numbers.json'
with open(filename, 'w') as f_obj: 
	json.dump(numbers, f_obj)

filename = 'numbers.json' 12 
with open(filename) as f_obj:
	numbers = json.load(f_obj) 
	print(numbers)

函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
使用函数json.load()加载存储在numbers.json中的信息, 并将其存储到变量numbers中。

remember_me.py
import json
# 如果以前存储了用户名,就加载它
# 否则,就提示用户输入用户名并存储它 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 you when you come back, " + username + "!")
else:
	print("Welcome back, " + username + "!")
重构

代码能够正确地运行,但可做进一步的改进——将代码划分为 一系列完成具体工作的函数。这样的过程被称为重构。

import json

def get_stored_username():
	"""如果存储了用户名,就获取它"""
	filename = 'username.json' 
	try:
		with open(filename) as f_obj: 
			username = json.load(f_obj)
	except FileNotFoundError:
		return None 
	else:
		return username

def greet_user(): 
	"""问候用户,并指出其名字""" 
	username = get_stored_username()
	if username:
		print("Welcome back, " + username + "!")
	else:
		username = input("What is your name? ") 
		filename = 'username.json'
		with open(filename, 'w') as f_obj:
			json.dump(username, f_obj)
			print("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、付费专栏及课程。

余额充值