python学习part10:第十章 文件和异常
教材:《python:从入门到实践》
今天有别的学习任务,相应的 自由学习时间也就少了,所以今天学习内容不多,估计以后也不能保持很快的进度来学习py了,不过,学无止境,什么时候学都不算晚,慢慢来吧,干巴爹!
越到后面遇到的问题也就多了,之前的学习过程或多或少也还留着些未解决的问题,忘了整理出来。从今起吸取教训,以后遇到的问题贴在这里。
随手记
在本章节的学习过程中遇到了一个有点逗的问题,逗得不是问题,是我。
我在使用附加模式写入文件 ,发现重复运行本程序 ,文档并没有附加内容,反而一直被重写。搞了半天,问这问那,最后发现附加模式的上面使用了覆写模式写入....
所以每次执行程序都会被覆写。
map()函数
map(function,iterable,iterable...)
他的作用是吧function作用于所有iterable 中的每个元素;
function是函数名。后面的iterable的个数要对应前面函数的形参的个数。
百度查到一篇博文中说map函数的结果以列表的形式返回,但是在
py3的版本中map函数返回的是迭代器,所以要对map()使用list()以期获得真正需要的结果。
.split()方法
比如str.split(分隔符,num) 将str按照指定的分隔符分隔num次,即分成num+1段。
num默认-1(全部分隔),分隔符默认空格(包括回车) 参数可以都不填
split返回值是列表形式
open的模式 r r+ w w+ a a+
上面的图截自风起616的博客园博客。
读写文件时,readlines 、readline、read 这些方法读到哪 读取指针就会指到哪
如果需要再读一遍或者有其它类似需要,可以用seek方法使读取指针重定位。
seek(参数1,参数2) 参数1是偏移位置,代表需要偏移的字节数(受编码影响),参数2可以是0,1,2分别代表从头、当前位置、尾开始读,默认为0。
路径问题
双斜杠\\ 或者单反斜杠/
range()函数 构建数值列表最后需放在list函数里才能成为列表。 range步长默认为1 所以如果要建立逆序数值列表,记得声明一个负数步长!
这里注意到json字符串和字典很相似,以后抽空整理一下。
json.dump可以重复写入json数据吗?那如何json.load()读取?下面的图是将json.dump时的模式设为 附加模式的结果,第二次运行程序(即添加了2次数据到json'文件),json.load时就会报错
今天没时间学MySQL,很惭愧。不对,是昨天。今天还有新的任务。
#part 10 第十章 文件和异常
path1='C:\\Users\\13065\\Desktop\\part10.txt'
path2='C:/Users/13065/Desktop/part10.txt'
path3='../../Desktop/part10.txt'
with open(path3) as example:#使用with是为了避免close的麻烦
contents =example.read()#read函数读取文件全部内容
#教材中讲read()函数在到达文档末尾时会返回一个空字符串并在打印时表现为一空行
#但是实际上并没有这样,可能是因为py版本的原因
print(contents.strip())
print('----------------------****---------------------')
#路径格式
#1.相对路径
#单斜杠,../表示上一层 需要几层写几层。
#2.绝对路径
#用单斜杠表示绝对路径 即/ 参考path2
#这里用双反斜杠表示绝对路径,和书上不同。这里用\会报错,需要用\\ 参考path1
#逐行读取
with open(path1) as text1:
'''for line in text1:
print(line.strip()+'!')#不加.strip()会有间隔的空白行'''
list1=text1.readlines()
text1.seek(0,0)#可以用seek'函数重定向读取指针的位置
list2=text1.readlines()
#list2=list1 #文件只能读一遍?文件读完后,指针指着的位置就是末尾了,空的
for one in list1:
print(one.strip()+'?')
union=''
for one in list2:
union+=one.strip()
print(union+'********list2****')
path4='C:/Users/13065/Desktop/part10-1.txt'
with open(path4) as big:
bigline=big.readlines()
string=''
for one in bigline:
string+=one
print(string[:50])
#写入文件
path5='C:\\Users\\13065\\Desktop\\part10-2.txt'
with open(path5,'w') as towrite:#如果省略了第二个参数,则默认为只读
towrite.write('Nice to meet u!')
towrite.write('So do i!\n')#如果需要换行则自己加入换行符
towrite.write('difference between \\n and no \\n')
with open(path5,'a') as toadd:
for one in list1:
toadd.write(one)#这里如果加了strip将不会换行
#open的模式:w,w+,r,r+,a,a+ 我的易错点:忘记加引号
#异常
#try-except 代码块
#直接print(5/0)会提示error的
try:
print(5/0) #这里的代码不是只告诉程序“这是个错误行为” 而是会执行的
except ZeroDivisionError:
print('ur chushu =0! its a wrong behavior!')
#下面举个例子
try:
num1,num2=map(int,input('pls input two nums : ').split(','))
result=num1/num2
except ZeroDivisionError:
print('wrong! chushu cant be 0!')
except ValueError:
print('at least a num is not int')
else:#可以吧不出错的结果放在try里,也可以放在else里。
print(result)
#本块是灵光一闪,想起来要测试一下map函数和split函数,搞懂了,很开心
aaa=input('try to use split').split()
print(aaa)
def get(a,b):
return a+b
formap1=[2,3,4]
formap2=[1,2,3]
formap4=[0,4,6]
map1=map(get,formap1,formap2)
print(list(map1))
test1=range(10,6,-1)
print(list(test1))
#可以通过吧with..open代码块写到一个函数中来使用多个文件
#如果你希望程序在error时保持沉默那么,在except错误名的代码块中使用pass
#存储数据
#使用json.dump()和json.load()
import json
#json.dump()接受两个实参,要存储的数据和要存储进的文件
numbers=[2,3,4,5,6,7]
path6='C:\\Users\\13065\\Desktop\\part10-4.json'
with open(path6,'w+') as json1:#这是写入
json.dump(numbers,json1)
with open(path6) as json2:
reader=json.load(json2)#这是读取
print('read result:',reader)
#重构
#代码能够正确地运行,但可做进一步的改进 —— 将代码划分为一系列完成具体工作的函数。
#这样的过程被称为 重构
#先把大部分逻辑放到一个函数中,然后在看能不能再把函数中的一部分逻辑拿出来做成另一个函数
#就是重构一次,再重构一次,再再再...