2022/12/31连续写作第三天
文章目录
文件读写
从文件中读取数据
创建一个pi.txt文件并保存
3.1415926535
8979323846
2643383279
然后用如下代码打开文件
with open('pi.txt') as file_object:
contents = file_object.read()
print(contents)
代码出现了三个关键字:
- 函数open()
open()以文件名"pi.txt"为参数将文件打开 - 关键字with
with在不再需要访问文件后将其关闭,如果没有with,则需要同时调用open()和close()打开和关闭文件,而这样可能会导致文件过早/过晚关闭 - 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())
- 直接line in file:
在with函数结束执行后文件关闭,file只是文件I/O的变量名 - lines = file.read()
lines直接复制整个文件的内容,不可逐行操作 - 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的文件与异常
谢谢大家!