小数据文件操作及函数
Posted 辉煌-love
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小数据文件操作及函数相关的知识,希望对你有一定的参考价值。
小数据
小数据池:为了节省内存空间。
is、 == 和id
== :数值的比较
is :内存地址的比较
id 查看内存地址
int -5~256
str 有特殊字符不存在小数据池。
单个字符*int(20) 以内 有小数据池。
编码
英文:
str: 表现形式: s = ‘alex‘
内部编码方式:unicode
bytes:表现形式: s = b‘alex‘
内部编码方式:非unicode(utf-8,gbk...)
中文:
str: 表现形式: s = ‘中国‘
内部编码方式:unicode
bytes:表现形式: s = b‘\xe2\xe2\xe2\xe2\xe2\xe2\‘
内部编码方式:非unicode(utf-8,gbk...)
str---> bytes s.encode(‘gbk‘) s.encode(‘utf-8‘) 编码
bytes ---> str s.decode(‘gbk‘) s.decode(‘utf-8‘) 解码
1 s = ‘fdsagsadfsad方式打开家乐福;按时fdsafdsa‘ 2 #ip地址 端口等等 3 s1 = input(‘你好‘) 4 s1 5 s = ‘laonanhai‘ 6 s1 = b‘laonanhai‘ 7 print(type(s)) 8 print(type(s1))
1 s = ‘alex‘ # str 2 s1 = s.encode(‘utf-8‘) # bytes 3 # encode 编码 :str --- > bytes 4 s = ‘hello girl‘ 5 s1 = s.encode(‘utf-8‘) 6 print(s1) 7 8 s = ‘hello girl‘ 9 s1 = s.encode(‘gbk‘) 10 print(s1) 11 s = ‘中国‘ 12 s1 = s.encode(‘utf-8‘) 13 print(s1) 14 15 s = ‘中国‘ 16 s1 = s.encode(‘gbk‘) 17 print(s1)
赋值与copy
对于赋值运算,指向的是同一个内存地址。字典,列表,集合都一样。
l1 = [1,2,3] l2 = l1 l2.append(111) # print(l1,l2) print(id(l1)) print(id(l2)) s = 1000 s1 = s print(id(s)) print(id(s1))
copy 不是指向一个,在内存中开辟了一个内存空间对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
l1 = [1,2,3] l2 = l1.copy() l1.append(111) print(id(l1),id(l2)) l1 = [1,2,[1,2,3,[22,33,44]],4] l2 = l1.copy() l1[2].append(666) print(l1) print(l2) print(id(l1)) print(id(l2))
对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变.
1 import copy 2 l1 = [1, 2, [1, 2, 3], 4] 3 l2 = copy.deepcopy(l1) 4 l1[2].append(666) 5 print(l1,l2) 6 l2 = copy.deepcopy(l1) 7 l1[2].append(666) 8 print(l1) 9 print(id(l1[2]),id(l2[2])) 10 l1 = [1,2,3] 11 l2 = l1 12 l2.append(111) 13 print(l1,l2) 14 15 l1 = [1,2,3,[22,33]] 16 l2 = copy.deepcopy(l1) 17 print(l2) 18 l2 = l1[:] 19 l1[3].append(666) 20 print(l2) # [1, 2, 3, [22, 33, 666]] 21 22 l1 = [1,2,3,] 23 l2 = l1[:] 24 l1.append(666) 25 print(l2)
文件操作
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
1,打开文件,产生一个文件句柄。
2,对文件句柄进行
3,关闭文件。
f = open(‘D:\护士老师主妇空姐联系方式.txt‘,encoding=‘utf-8‘,mode=‘r‘) content = f.read() print(content)
f:变量,f_obj,file,f_handler,...文件句柄。open windows的系统功能,windows默认编码方式:gbk,linux默认编码方式utf-8。f.close()
流程:打开一个文件,产生一个文件句柄,对文件句柄进行操作,关闭文件。
读
1、全部读出来
f = open(‘D:\护士老师主妇空姐联系方式.txt‘,encoding=‘gb2312‘) 1:全部读出来f.read() f = open(‘log‘,encoding=‘utf-8‘) content = f.read() print(content,type(content)) f.close()
2、一行一行的读
f = open(‘log‘,encoding=‘utf-8‘) print(f.readline()) print(f.readline()) print(f.readline()) print(f.readline()) print(f.readline()) f.close()
3、将原文件的每一行作为一哥列表的元素。
f = open(‘log‘,encoding=‘utf-8‘) print(f.readlines()) f.close()
4、读取一部分read(n),在r模式下,read(n)按照字符去读取。,在rb模式下,read(n)按照字节去读取。
f = open(‘log‘,encoding=‘utf-8‘) print(f.read(3)) f.close() f = open(‘log‘,mode=‘rb‘) content = f.read(4) print(content) f.close()
5、循环读取
f = open(‘log‘,encoding=‘utf-8‘) for i in f: print(i.strip()) f.close()
6、非文字类的文件时,用rb
f = open(‘D:\护士老师主妇空姐联系方式.txt‘,mode=‘rb‘) content = f.read() print(content) f.close()
写
1、没有文件,创建一个文件写入内容
f = open(‘log1‘,encoding=‘utf-8‘,mode=‘w‘) f.write(‘儿科王金发;剪短发了肯定撒就废了;就‘) f.close()
2、有文件,将原文件内容清空,在写入内容。
f = open(‘log1‘,encoding=‘utf-8‘,mode=‘w‘) f.write(‘666‘) f.close()
3、wb
f = open(‘log‘,mode=‘wb‘) f.write(‘老男孩教育‘.encode(‘utf-8‘)) f.close()
4、没有文件,创建一个文件追加内容
f = open(‘log2‘,encoding=‘utf-8‘,mode=‘a‘) # f.write(‘666‘) # f.close()
5、有文件,直接追加内容。
f = open(‘log2‘,encoding=‘utf-8‘,mode=‘a‘) f.write(‘666‘) f.close()
7、r+ 先读,后追加 一定要先读后写
f = open(‘log‘,encoding=‘utf-8‘,mode=‘r+‘) content = f.read() print(content) f.write(‘aaa‘) f.close()
8、错误的
f = open(‘log‘,encoding=‘utf-8‘,mode=‘r+‘) f.write(‘BBB‘) content = f.read() print(content) f.close()
9、w+ 先写后读
f = open(‘log‘,encoding=‘utf-8‘,mode=‘w+‘) f.write(‘中国‘) #print(f.tell()) # 按字节去读光标位置 f.seek(3) # 按照字节调整光标位置 print(f.read()) f.close()
10、a+ 追加读
f = open(‘log‘,encoding=‘utf-8‘,mode=‘a+‘) f.write(‘BBB‘) content = f.read() print(content) f.close()
11、其他方法
f = open(‘log‘,encoding=‘utf-8‘) print(f.read()) print(f.writable()) f.close()
f = open(‘log‘,encoding=‘utf-8‘,mode=‘a‘)
f.truncate(7) # 按字节对原文件截取
f.close()
12、功能一:自动关闭文件句柄,功能二:一次性操作多个文件句柄。
with open(‘log‘,encoding=‘utf-8‘) as f: print(f.read()) with open(‘log1‘,encoding=‘utf-8‘) as f1: print(f1.read()) with open(‘log‘,encoding=‘utf-8‘) as f1, open(‘log1‘,encoding=‘utf-8‘) as f2: print(f1.read()) print(f2.read())
1,将原文件读取到内存。
2,在内存中进行修改,形成新的内容。
3,将新的字符串写入新文件。
4,将原文件删除。
5,将新文件重命名成原文件。
import os with open(‘log‘,encoding=‘utf-8‘) as f1, open(‘log.bak‘,encoding=‘utf-8‘,mode=‘w‘) as f2: content = f1.read() new_content = content.replace(‘alex‘,‘SB‘) f2.write(new_content) os.remove(‘log‘) os.rename(‘log.bak‘,‘log‘) import os with open(‘log‘,encoding=‘utf-8‘) as f1, open(‘log.bak‘,encoding=‘utf-8‘,mode=‘w‘) as f2: for i in f1: new_i = i.replace(‘SB‘,‘alex‘) f2.write(new_i) os.remove(‘log‘) os.rename(‘log.bak‘,‘log‘)
函数的初识
重复代码多,可读性差,所以函数产生了:函数就是封装一个功能。
例如:def my_len(): ;def 关键字 定义一个函数;my_len 函数名书写规则与变量一样。; def 与函数名中间一个空格。;函数名():加上冒号函数体
def my_len(): count = 0 for j in l1: count += 1 print(count) my_len()
函数的返回值,写函数,不要再函数中写print()
while True: print(222) print(666) print(len([1,23,4]))
1,在函数中,遇到return结束函数。
2,将值返回给函数的调用者。
无 return
return None
return 1个值 该值是什么,就直接返回给函数的调用者,函数名()
return 多个值 将多个值放到一个元组里,返回给函数的调用者。
def fun(): print(111) print(222) print(333) return 2,3,4 a,b,c = fun() print(a,b,c)
def my_len(): count = 0 for j in l1: count += 1 return count return 777 return [1,2,3] return 1,2,3,[22,33],‘alexsb‘ ret = my_len() print(ret) print(my_len()) print(len(‘3243243‘))
函数的传参
def my_len(l): # l 形式参数 形参 print(l) count = 0 for j in l: count += 1 return count a = ‘fdsafdsafdsagfsadf‘ print(my_len(a)) # 实际参数 ,实参 print(my_len([1,2,3]))
实参角度:1,位置传参。按顺序,一一对应
def my_len(l): # l 形式参数 形参 print(l) count = 0 for j in l: count += 1 return count a = ‘fdsafdsafdsagfsadf‘ print(my_len(a)) # 实际参数 ,实参 print(my_len([1,2,3])) def func(a,b,c): print(a) print(b) print(c) func(‘fdsafdas‘,3,4)
写一个函数,功能比大小,
def max_min(a,b): if a > b: return a else: return b num1 = int(input(‘请输入一个数:‘)) num2 = int(input(‘请输入另一个数:‘)) print(max_min(num1,num2))
ps: 三元运算
def max_min(a,b): if a > b: return a else: return b print(max_min(100,200)) def max_min(a,b): return a if a > b else b print(max_min(300,200))
关键字传参,不按顺序,一一对应
def max_min(a,b): return a if a > b else b print(max_min(b = 300,a = 200))
混合传参,关键字参数永远在最后面
def func1(a,b,c,d,e): print(a) print(b) print(c) print(d) print(e) func1(1,2,d=4,c=3,e=5) func1(1,4,d=2,c=3,e=5)
按照形参角度
1,位置传参。按顺序,一一对应。
def func(a,b,c): print(a) print(b) print(c) func(‘fdsafdas‘,3,4)
2,默认参数。
def func(a,b=666): # print(a,b) func(1,2) func(1,777) func(1,2) s = ‘alex‘.center(30,‘*‘) print(s) def Infor_entry(username,sex=‘男‘): with open(‘name_list‘,encoding=‘utf-8‘,mode=‘a‘) as f1: f1.write(‘{}\t{}\n‘.format(username,sex))
while True: username = input(‘请输入姓名(男生以1开头)‘).strip() if ‘1‘ in username: username = username[1:] Infor_entry(username) else: Infor_entry(username,‘女‘)
以上是关于小数据文件操作及函数的主要内容,如果未能解决你的问题,请参考以下文章