提示:这里可以添加本文要记录的大概内容:
为巩固近期所学,写下该文
提示:以下是本篇文章正文内容,下面案例可供参考
一、File的相关操作
1.文件操作的基本形式
参数说明
我们后面用的with open()结构,这个的好处时在文件操作结束后会自动关闭文件。
1 .文件的读入操作
主要的操作函数有
read() 从文件读取指定的字节数,如果未给定或为负则读取所有
readline()一次读取一行
readlines()一次读取所有内容,返回的时一个列表
下面的代码展示了这几个函数的使用方法,也展示了读取全文的方法
with open("C:\\Users\\LENOVO\\Documents\\记事本的使用教程.txt", "r",encoding="utf8") as f:
print(f.read())#利用read()来进行读取整个内容 只读r是可以缺省的
"""with open("C:\\Users\\LENOVO\\Documents\\记事本的使用教程.txt", "r") as f:
print(f.read())# 省略默认为gbk"""
with open("C:\\Users\\LENOVO\\Documents\\记事本的使用教程.txt", "r",encoding="utf8") as f:
text = f.readline() #一次读取一行
print(text)
print("--" * 30)
with open("C:\\Users\\LENOVO\\Documents\\记事本的使用教程.txt", "r",encoding="utf8") as f:
while True:#一行一行遍历全文
text = f.readline()
if not text:#这是什么意思?到最后的时候text是空的
break
else:
print(text,end = '')
print("--" * 30)
with open("C:\\Users\\LENOVO\\Documents\\记事本的使用教程.txt", "r",encoding="utf8") as f:
text = f.readlines()#读入所有行,以每行为元素,生成一个列表
print(text)
print("---" * 30)
with open("C:\\Users\\LENOVO\\Documents\\记事本的使用教程.txt", "r",encoding="utf8") as f:
for text in f:#和readline类似
print(text)
2.文章的写入操作
这里展示的操作函数有
write() 将字符串写入一个文件
writelines() 向文件写入一个序列的字符串列表,如果需要换行则需要自己加入每行的换行符号
在这里强调,文件的读写操作时靠移动一个指针来读写文字,指针在文件的末位置,进行读取操作不会读出值,同样,进行写入操作,也不会覆盖掉内容。我们可以通过seek()函数实现。
with open("C:\\Users\\LENOVO\\Documents\\要严格要求自己.txt", "w", encoding = "utf8") as f:
f.write("不是你做不到,而是你没有下定决心\n")
with open("C:\\Users\\LENOVO\\Documents\\要严格要求自己.txt", "w", encoding = "utf8") as f:
f.write("不是因为你做不到,而是你不想去做\n")
#会覆盖掉
with open("C:\\Users\\LENOVO\\Documents\\要严格要求自己.txt", "a", encoding = "utf8") as f:
f.write("不是因为你做不到,而是你不想去做\n")
#添加到后面
ls = ["每天跑步好痛苦", "为什么要每天跑步?", "因为我之前太摆了"]
with open("C:\\Users\\LENOVO\\Documents\\要严格要求自己.txt", "a", encoding = "utf8") as f:
f.writelines(ls)#将一个元素为字符串的列表整体写入文件!注意是列表
with open("C:\\Users\\LENOVO\\Documents\\要严格要求自己.txt", "r+", encoding = "utf8") as f:
# for line in f:
# print(line) #全部读一边后指针到达结尾
f.seek(0, 2) #或者可以将指针移到末尾,f.seek(偏移字节数,位置(0:开始,1:当前位置,2:结尾)
ls = ["每天跑步好痛苦", "为什么要每天跑步?", "因为我之前太摆了"]
f.writelines(ls)
with open("C:\\Users\\LENOVO\\Documents\\要严格要求自己.txt", "a+", encoding = "utf8") as f:
f.write("不是因为你做不到,而是你不想去做\n")
4.介绍两种格式
1)csv格式:用逗号将数据分开的字符序列,可以用excell打开
with open("C:\\Users\\LENOVO\\Documents\\成绩.csv", "r", encoding = "utf8") as f:
ls = []
for line in f:
ls.append(line.strip("\n").split(",")) #strip() 去除'\n' 以split(",") 分割
for res in ls:
print(res)
#这个可谓是太6啦!
ls = [["编号", "数学成绩", "语文成绩"], ["1", "100", "98"], ["2", "89", "99"], ["3", "99", "89"]]
with open("C:\\Users\\LENOVO\\Documents\\成绩.csv", "w", encoding = "gbk") as f:
for row in ls:
f.write(",".join(row) + "\n")#聚合字符
2)生成json文件
import json
score = {"P":{"math":96, "physics":98},\
"b":{"math":88, "physics":100},\
"c":{"math":98, "physics":99}
}
with open("C:\\Users\\LENOVO\\Documents\\score.json","w",encoding = "utf-8") as f:
#indent 表示字符串换行+缩进 ensure_ascii = False 显示中文
json.dump(score, f, indent = 4, ensure_ascii=False)
二、异常
在执行程序的过程中,有可能会遇到不符合预期的情况,如果遇到这种情况就终止程序的运行显的很麻烦,为了解决这个问题,我们可以使用python的异常分析
常见的错误有:
除0运算 ——ZeroDivisionError
找不到可读文件——FileNotFoundError
值错误——ValueError
索引错误——IndexError 下标超出范围
类型错误——TypeError
以下介绍了 异常处理 万能异常Exception try-except-else try-except-finally结构
#异常处理
#如果try内代码块顺利执行,except不被触发,否则触发
ls = []
d = {"name":"美女"}
try:
#y = m
ls[3]
# d["age"]
except NameError:
print("变量名不存在")
except IndexError:
print("索引超出界限")
except KeyError:
print("键不在")
#万能异常Exception(所有错误的代名词)
# e捕获异常的值as
ls = []
d = {"name":"美女"}
try:
#y = m
ls[3]
# d["age"]
except Exception as e:
print(e)
#try-except-else 如果try模块执行,则else模块也执行
try:
with open("C:\\Users\\LENOVO\\Documents\\要严格要求自己.txt", "r", encoding = "utf-8") as f:
text = f.read()
except FileNotFoundError:
print("没有找到文件")
else:
for s in ["\n", ","]:
text = text.replace(s,"")
print(len(text))
#try_except_else 不论try模块是否执行,finally都会执行
try:
with open("C:\\Users\\LENOVO\\Documents\\要严格要求自己.txt", "r", encoding = "utf-8") as f:
text = f.read()
except FileNotFoundError:
print("没有找到文件")
finally:
for s in ["\n", ","]:
text = text.replace(s,"")
print(len(text))
三:列表的拷贝
这里介绍错误的拷贝方式,浅拷贝,与深拷贝
错误的拷贝方式是直接赋值,它相当于给列表在取了个别名,改变其中一个是会影响另外一个列表
浅拷贝在改变可变数据类型时会影响另外一个
而深拷贝就是两个列表没有任何瓜葛了呀
原理是列表是使用引用数组存放数据,在列表的位置上其实存放的是地址,在浅拷贝的时候如果改变了可变数据类型,因为地址是一样的,所以另外一个也会改变,如果改变的是不可变数据类型,改变了它会生成一个新的类型,故指向的地址发生改变了
#浅拷贝
lst1 = [1, [2, 3, 4], (5, 6, 7, 8), {"a" : 9, "b" : 10}]
lst2 = lst1 #错误的拷贝方式,相当于给lst1再取了个别名,两个名字都是它
print(lst1, lst2)
lst1[1].insert(2,5)
print(lst1)
print(lst2)
#浅拷贝是复制了lst1的地址,赋值给lst3,它们是两个不同的变量
lst3 = lst1.copy()
print(lst1)
print(lst3)
lst1[2] +=(8, 9) #元组不可以修改元素值,可以删除整个元组和对元组进行拼接
print(lst1)
print(lst3)
#进行浅拷贝后,对其中一个列表里面的列表、字典操作,会影响另外一个列表,因为存的是地址,而元组是不可变的,对其中一个列表的元组进行操作会生成一个新列表地址
#深拷贝(拷贝后两个列表没有任何瓜葛了)
import copy
lst2 = copy.deepcopy(lst1)
lst1[-1]["c"] = 10
lst2[1].append(10)
print(lst1)
print(lst2)
感想
最近我终于找到了学习python的节奏,勿好高骛远,一天看十几节课,而是要脚踏实地,把它敲下来,理解。