Python读写文件&is和==区别&常用模块
目录
1. 读写文件
1. open函数用来打开文件
1. open(name[, mode[, buffering]]) 打开文件可传的参数
1. open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象。
2. 模式(mode)和缓冲(buffering)参数都是可选的
2. 打开文件的模式有
• r,只读模式(默认)。
• w,只写模式。【不可读;不存在则创建;存在则删除内容;】
• a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
注: "+" 表示可以同时读写某个文件
• w,只写模式。【不可读;不存在则创建;存在则删除内容;】
• w+,写读
• a+,同a
3、with语句
作用:将打开文件写在with中当对文件操作完成后with语句会自动帮关闭文件,避免忘记写f.close()
with open("data1.txt",‘r‘,encoding = ‘utf-8‘) as f: for line in f: print(line)
with 读文件
2. 三种读操作比较
read(): 指定读取指定大小的文件(默认一次读取所有)
readline(): 逐行读取,适合读大文件
readlines(): 一次性读取所有文件, 将文件按行读取成列表
#1. read()一次读取所有内容 ‘‘‘aaa111 bbb222‘‘‘ f = open(r"data.txt") print(f.read()) f.close() #2. readline(),每次只读取一行,光标下移 ‘‘‘ 0: aaa111 1: bbb222 ‘‘‘ f = open(r"data.txt") for i in range(2): print(str(i) + ": " + f.readline(),) #3. 一次读取所有,每行作为列表的一个值 ‘‘‘[‘aaa111\n‘, ‘bbb222\n‘]‘‘‘ f = open(r"data.txt") print(f.readlines()) 三种读操作举例
三种读写操作举例
3. 将data1.txt中内容读取并写入到data2.txt中
f1 = open(‘data1.txt‘,‘r‘) f2 = open(‘data2.txt‘,‘w‘) for line in f1: f2.write(line) f1.close() f2.close() 将data1.txt内容读取到data2.txt
4. 使用eval()方法将文件读取成字典
f = open(‘data1.txt‘) f1 = (f.read()) data = eval(f1) f.close() print(data) # 运行结果: {‘k2‘: ‘v2‘, ‘k3‘: ‘v3‘, ‘k1‘: ‘v1‘}
5. 将文件内容读取成列表
lock = [] f = open("password.txt") for name in f.readlines(): lock.append(name.strip(‘\n‘)) print(lock) 运行结果: [‘aaa 111‘, ‘bbb 222‘, ‘ccc 333‘]
6. 经典面试题:现在有一个5G的文件,用python写入另一个文件里
read(): 指定读取指定大小的文件(默认一次读取所有)
readline(): 逐行读取,适合读大文件
readlines(): 一次性读取所有文件, 将文件按行读取成列表
我们使用了一个 while 循环来读取文件内容,每次最多读取 8kb 大小
这样可以避免之前需要拼接一个巨大字符串的过程,把内存占用降低非常多
#!/usr/bin/python # -*- coding: utf-8 -*- def read_big_file_v(fname): block_size = 1024 * 8 with open(fname,encoding="utf8") as fp: while True: chunk = fp.read(block_size) # 当文件没有更多内容时,read 调用将会返回空字符串 ‘‘ if not chunk: break print(chunk) path = r‘C:\aaa\luting\edc-backend\tttt.py‘ read_big_file_v(path)
2. is和==区别
is不仅数据一样内存地址也一样
== 只判断数据和数据类型一样即可
3. 常用模块
re模块
findall: findall(pattern,string),查找所有满足条件的字符 search: search(pattern,string[,flags]),在字符串中查找,返回第一个匹配的字符串 分装返回对象为,span = (0,5) (匹配的位置)左闭右开 match : match(pattern,string[,flags]) 在字符串开头查找,与search返回值相同 split:split(pattern,string[,maxsplit=0])根据模式切割字符串 compile:compile(pattern,[,flags]) 根据包含正则表达式的字符串创建模式对象 sub : sub(pat,repl,string[,count=0]) 将字符串中模式pat匹配的子串都替换为repl
subprocess 模块
subprocess原理以及常用的封装函数
运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序
在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。
subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用
另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。
subprocess常用函数
#1、返回执行状态:0 执行成功 retcode = subprocess.call([‘ping‘, ‘www.baidu.com‘, ‘-c5‘]) #2、返回执行状态:0 执行成功,否则抛异常 subprocess.check_call(["ls", "-l"]) #3、执行结果为元组:第1个元素是执行状态,第2个是命令结果 >>> ret = subprocess.getstatusoutput(‘pwd‘) >>> ret (0, ‘/test01‘) #4、返回结果为 字符串 类型 >>> ret = subprocess.getoutput(‘ls -a‘) >>> ret ‘.\n..\ntest.py‘ #5、返回结果为‘bytes‘类型 >>> res=subprocess.check_output([‘ls‘,‘-l‘]) >>> res.decode(‘utf8‘) ‘总用量 4\n-rwxrwxrwx. 1 root root 334 11月 21 09:02 test.py\n‘
将dos格式文件转换成unix格式
subprocess.check_output([‘chmod‘, ‘+x‘, filepath]) subprocess.check_output([‘dos2unix‘, filepath])