Python基础知识10——文件和异常

本章内容来自书籍,记录下来仅方便复习,如有侵权,请联系作者删除。
+++python学习笔记+++

一、从文件中读取数据

读取一个文本文件的内容,重新设置这些数据的格式,并将其写入文件,让浏览器能够显示这些内容。

1. 读取整个文件

file_path = "D:/.../.../test.txt"

with open(file_path) as file_object:
	contens = file_object.read()
	print(contens)

(1)分析with open(file_path) as file_object:如下:

  • 函数open(),接受一个参数(文件的路径),返回一个表示文件的对象,Python将这个对象存储在"as"指定的变量中。
  • 关键字with,在不需要访问文件后将其关闭。

我们也可以调用open()和close()来打开和关闭文件,但是这样做,如果程序存在bug,文件将不会关闭,可能会造成数据丢失。使用with关键字,Python自会在合适的时候自动将其关闭。

(2)方法read(),读取文件对象的内容,并返回到指定变量中。

2. 文件路径

文件路径,在Linux和OS X系统中,使用斜杠(/),在windows系统中,使用反斜杠(\

  • 绝对路径,将文件在计算机中的准确位置告诉Python
  • 相对路径,文件的位置在python_work中,可以使用相对路径,否则使用绝对路径。

3. 逐行读取
用循环,遍历file_object

 with open(file_path) as file_object:
 	for line in file_object:
 		print(line)

4. 创建一个包含文件各行内容的列表

使用with关键字时,函数open()返回的文件对象,只在with代码块内可用。如果要在代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中。

 with open(file_path) as file_object:
 	lines = file_object.readlines()

for line in lines:
	print(line.rstrip())

分析lines = file_object.readlines()如下:

  • 方法readlines()从文件中读取每一行,并将其存储在一个列表中;
  • 该列表可存储到指定变量(lines)中;
  • 在with代码块之外,我们依然可用使用这个变量(lines)。

5. 使用文件的内容
将文件读取到内存中后,就可以以任何方式使用这些数据了。

file_path = "pi_30_digits.txt"

with open(file_path) as file_object:
    lines = file_object.readlines()

pi_string = ''
for line in lines:
    pi_string += line.strip()

print(pi_string)
print(len(pi_string))

运行结果:
3.141592653589793238462643383279
32

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

6. 包含一百万位的大型文件

file_name = 'pi_million_digits.txt'

with open(file_name) as file_object:
    lines = file_object.readlines()

pi_string = ''
for line in lines:
    pi_string += line

print(pi_string[:52])
print(len(pi_string))

7. 圆周率值中包含你的生日吗

birthday = input("Please enter your birthday: ")
if birthday in pi_string:
	print("yes")

二、写入文件

1. 写入空文件
在调用open()时需要提供另一个实参,告诉Python你要写入打开的文件。

file_name = 'programming.txt'

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

函数open()中,我们提供了两个实参,第一个实参是要打开的文件名称,第二个实参打开文件的模式,如果省略了模式实参,Python默认以只读模式打开文件。

  • 第一个实参:
    如果读取的文件不存在,会报错;
    如果写入的文件不存在,函数open()将自动创建。

  • 第二个实参:
    读取模式(r),只读
    写入模式(w),覆盖写入
    附加模式(a),追加写入
    能够读取和写入(r+

调用方法: read(),readlines(),write()
方法write(),需要在括号中传入实参,提供需要写进文件中文本内容。

Python只能将字符串写入文本文件,要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。

2. 写入多行

调用方法write(),传入的形参中,包含换行符"\n"

file_object.write("I love progranming.\n")
file_object.write("I love creating new games.\n")

3. 附件到文件

附加模式,是追加写入。

with open(file_name,'a') as file_object:
	file_object.write("I love python\n")

三、异常

异常是使用try-except代码块处理的。

1. 处理ZeroDividionError异常
数字除以0时报错。

2. 使用try-except代码块

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

运行结果:
You can't divide by zero.

3. 使用异常避免崩溃
尽量避免程序崩溃。否则可能会被攻击。

4. else代码块

try语句:可能发生异常的代码
except语句:try代码中引发指定的异常时,处理情况。
else语句:try代码块成功执行时,才需要运行的代码

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

5. 处理FileNotFoundError异常

try:
    with open('test.txt') as file_object:
        lines = file_object.readlines()
except FileNotFoundError:
    print("Sorry, the file test.txt is not found")

找不到文件时,引发FileNotFoundError异常。
这个错误是由函数open()导致的,因此要处理这个错误,必须将try语句放在open()代码行之前。

6. 分析文本
使用方法split()
方法split()以空格为分隔符将字符串拆分成很多个部分,并将这些部分都存储到一个列表中。

contents = f_object.read()

words = contents.split()
num_words = len(words)
print("num_words"+str(num_words))

7. 使用多个文件
将上式写成一个方法,用传入file_name.

def count_words(filename):
	--snip--

filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:
	count_words(filename)

要获取FileNotFoundError,避免traceback报错。

8. 失败时一声不吭

在except语句中使用pass

	try:
		--snip--
	except FileNotFoundError:
		pass
	else:
		--snip--

9. 决定报告哪些错误

根据需求,决定是否将捕获到的错误抛出,让用户知道。

四、存储数据

JAON(JavaScript Object Notation) 格式最初是为JavaScript开发的,当随后成了一种常见格式,被众多语言采用。

1. 使用json.dump()和json.load()

  • json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
  • json.load()接受一个实参,加载存储在指定文件中的信息。
import json

filename1 = 'number1.json'
filename2 = 'number2.json'
with open(filename1) as file_object:
    numbers = json.load(file_object)

# print(numbers)
# numbers = [2,3,4,5,6,7]

with open(filename2,'w') as file_object:
    json.dump(numbers,file_object)

2. 保存和读取用户生成的数据

import json

filename = 'username.json'

try:
    with open(filename) as file_object:
        user_name = json.load(file_object)

except FileNotFoundError as msg:
    user_name = input("Please enter your name: ")
    with open(filename,'w') as file_object:
        json.dump(user_name,file_object)
        print("Hello, "+user_name)

else:
    print("Hello, " + user_name + "! ")

try代码块尝试读取指定文件中的数据,如果文件不存在,except代码块将新建该文件并保存数据。

3. 重构
将代码块封装在方法中,一个方法实现一个功能。
read_stored_username(),读取文件数据
save_stored_username(),将数据写入文件
greet_user(),打印数据

import json

filename = 'username.json'

def read_stored_username():
    """如果文件存在,获取用户名"""
    try:
        with open(filename) as file_object:
            user_name = json.load(file_object)
    except FileNotFoundError:
        return None
    else:
        return user_name

def save_stored_username():
    user_name = input("Please enter your name: ")
    with open(filename,'w') as file_object:
        json.dump(user_name,file_object)
    return user_name

def greet_user():
    user_name = read_stored_username()
    if user_name:
        print("Hello, " + user_name + "! ")
    else:
        user_name = save_stored_username()
        print("Nice to meet you! " + user_name)
    
greet_user()

五、小结

学习了使用文件,一次性读取文件,写入文件,处理异常,存储Python数据结构,重构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值