Python学习笔记-17.09.25
输入一串字符,计算并输出里面每个字符的出现次数
mystr = input("请输入任意内容")
tongji = {}
for s in mystr:
n = tongji.get(s)
if n is None:
tongji.__setitem__(s,1)
else:
tongji.__setitem__(s,n+1)
#字符串格式化
for key in tongji:
print("{0} 出现了 {1}次".format(key,tongji.get(key)))
print("------------------------")
dict= sorted(tongji.items(), key=lambda d:-d[1])
for d in dict:
print("{0} 出现了 {1}次".format(d[0],d[1]))
print("------------------------")
dict= sorted(tongji.items(), key=lambda d:(-d[1],d[0].encode('gbk')))
for d in dict:
print("{0} 出现了 {1}次".format(d[0],d[1]))
这段代码是通过字典的特性完成,因为key不可重复,所以当字典中没有找到这个字符时,即次数为零,添加一个新的键值对,并把次数设置为1。当字典中已存在这个key时,把它的次数加一。
而后面的排序是通过lambda,因为用了serted函数进行排序,所以返回的是一个列表,里面储存的是元组,key=lambda d:(-d[1],d[0].encode(‘gbk’)))是通过元组的第二个元素,也就是原来字典中的value进行排序,我们的value储存的是字符出现次数,也就是根据次数进行排序。
而d[0].encode(‘gbk’)是根据key进行排序,我需求的是根据拼音进行排序,而字符编码gbk可以做到到,所以用.encode(‘gbk’)来完成。
IO
f = open("G:/file/a/test.txt")
of = open("G:/file/b/test.txt","w")
for line in f:
of.write(line)
print("ok")
f = open("G:/file/a/pic.bmp",'rb')
of = open("G:/file/b/pic.bmp",'wb')
# of.write(f.read())
f.seek(0,2)
size = f.tell()
print(round(size/1024/1024,2),"MB")
f.seek(0,0)
ofSize = 0
while True:
if ofSize>size:
break
str = f.readline(1024*10)
of.write(str)
of.flush()
ofSize += 1024*10
print("ok")
open() 将会返回一个 file 对象,我们通过操作这个对象来进行文件操作
语法:open(filename, mode)
mode模式
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
我们可以直接通过read()后write()来直接进行读写,因为read在不指定读写大小时是直接读取整个文件,但是这样效率不高,所以我们一般设置一个读写缓存区,在上面代码中,seek()方法可以跳到文件指定位置,我们可以通过这个方法来获取文件的大小,来判断我们的缓存区域需要循环多少次才能完成这次读写。
import pickle,pprint
class Person:
name = None
age = None
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return ("name:{0},age:{1}".format(self.name,self.age))
p = Person('zs',18)
f = pickle.dump(p,open("G:/file/a/person.data",'wb'))
pprint(pickle.load(open("G:/file/a/person.data",'rb')))
通过pickle序列化模块,我们可以把对象保存在本地并读写。
异常
class Aex(Exception):
def __str__(self):
return "Aex"
class Bex(Exception):
def __str__(self):
return "Bex"
class Cex(Exception):
def __str__(self):
return "Cex"
n = int(input("请输入整数"))
try:
if n == 1:
raise Aex()
if n == 2:
raise Bex()
if n == 3:
raise Cex()
print("ok")
except(Aex,Bex,Cex) as e:
print(e)
我们通过继承Exception来自定异常
而Python中通过try except来进行异常处理。raise 抛出异常