文件读写与异常(python)

本文介绍了Python中的文件读写操作,包括从文件中读取数据、处理文件路径、行操作、写入文件,以及如何使用try-except处理异常。讲解了如何删除文件中的空格和换行,检查字符串是否存在于文件中,以及如何处理文件打开异常。还展示了如何处理单个和多个文件的内容,使用json模块存储和读取数据,并通过重构代码提高程序的健壮性。
摘要由CSDN通过智能技术生成

2022/12/31连续写作第三天

文件读写

从文件中读取数据

创建一个pi.txt文件并保存

3.1415926535
  8979323846
  2643383279

然后用如下代码打开文件

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

代码出现了三个关键字:

  1. 函数open()
    open()以文件名"pi.txt"为参数将文件打开
  2. 关键字with
    with在不再需要访问文件后将其关闭,如果没有with,则需要同时调用open()和close()打开和关闭文件,而这样可能会导致文件过早/过晚关闭
  3. read()读取文件的全部内容并且作为一个长字符串赋给contents

文件路径

使用相对路径(所要打开的文件在当前代码文件的文件夹路径中)打开指定的文件
使用绝对路径(C:\Users\lenovo\Desktop\Code\CODE_Python)

windows使用的是\,但在代码中会被误认为是转义序列,可以用"\"转义

行操作

逐行读取

filename = "pi.txt"
with open(filename) as file:
    for line in file: #此处可以把 file当做一个由行构成的列表理解
        print(line)

将各行存储进一个列表中

filename = "pi.txt"
with open(filename) as file:
    lines = file.readlines()#逐行读取的另一种方式
for line in lines:
    print(line.rstrip())
  1. 直接line in file:
    在with函数结束执行后文件关闭,file只是文件I/O的变量名
  2. lines = file.read()
    lines直接复制整个文件的内容,不可逐行操作
  3. lines = file.readlines()
    创建了一个以各行为元素的列表(包括换行符\n)

使用文件

删除文件中的空格与换行

article=''#创建一个空字符串
for line in lines:
    article += line.strip()
print(article,len(article))

判断某段字符是否存在文件中

if "1415" in article:
    print("Y")

写入文件

想要在文件写入内容,首先打开文件是读写模式或者其他模式,这就需要open()的第二个参数
打开文件时,可指定:

  • 读取模式 (‘r’ )
  • 写入模式 (‘w’ ): 如果之前存在内容,则会清空之前的内容
  • 附加模式 (‘a’ ):在原有的内容后面附加
  • 读写模式 (‘r+’): 可读写(在文件开头读写,可能覆盖原来内容)

如果省略了模式实参,Python将以默认的只读模式打开文件。

with open ("pi.txt","a") as file:
    file.write("\n123456")

异常

用try - except应对程序可能出现的异常情况

print(5/0)

这条代码无疑会出现异常,异常会如图所示

ZeroDivisionError                         Traceback (most recent call last)  
Cell In [1], line 1  
----> 1 print(5/0)  

ZeroDivisionError: division by zero

报错为ZeroDivisionError类型,可以用try - except语句尝试执行5/0,如果不可,执行except类型:

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

如果后面还有,程序将继续运行后你的代码,这部分代码被视作正常代码
而try成功之后,要利用try得到的结果,则用else代码块

while True:
	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)

在try执行成功之后,执行else块

解决文件打开异常(FileNotFoundError)

有可能在打开文件时路径错误或者文件不存在,使用try - except避程序异常

filename = 'alice.txt'
contents = ''
try:
	with open(filename, encoding='utf-8') as f:
		contents = f.read()
except FileNotFoundError:
	print(f"Sorry, the file {filename} does not exist.")

对单个文件内容进行处理

filename='天龙八部.txt'
words = []
try :
	with open(filename) as f:
		article = f.read()
except FileNotFoundError:
	print("The {filename} has not been found!")
else:
	words = article.split()
	print(f"{filename} has {len(words)} words.")
	

处理多个文件

将该功能包装进函数内,每次需要时调用该函数

def count_word(filename):
    words = []
    try :
        with open(filename) as f:
            article = f.read()
    except FileNotFoundError:
        print(f"The {filename} has not been found!")
    else:
        words = article.split()
        print(f"The {filename} has {len(words)} words.")

count_word('pi.txt')
count_word('天龙八部.txt')

有的时候你希望没有出现失误不要报告,直接继续执行程序,这时可以用到关键词pass

def count_word(filename):
    words = []
    try :
        with open(filename) as f:
            article = f.read()
    except FileNotFoundError:
        pass
    else:
        words = article.split()
        print(f"The {filename} has {len(words)} words.")

count_word('pi.txt')
count_word('天龙八部.txt')

存储数据

用模块json存储数据
将会给出json.dump()和json.load()
1.json.dump接受两个实参,要存储的数据,存储的文件
json.dump(data, filename)

import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f:
    json.dump(numbers, f)

2.用json.load将内容读取到内存中

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

代码的重构

还可以将以上代码整合到函数中,函数A获取文件中的值并且返回,如果获取失败则返回None。函数B获取返回值并且决定下一步操作
给出例子

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 greet_user():
    """问候用户,并指出其名字。"""
    username = get_stored_username()
    if username:
        print(f"Welcome back, {username}!")
    else:
        username = input("What is your name? ")
        filename = 'username.json'
        with open(filename, 'w') as f:
            json.dump(username, f)
            print(f"We'll remember you when you come back, {username}!")

greet_user()

~Python的文件与异常
谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值