python3_文件操作
Python中open函数参数r,r+,w,w+,a,a+的区别 - 简书 (jianshu.com)
open()——a、a+、r+、w+区别 - _raindrop - 博客园 (cnblogs.com)
1、打开文件
open() 将会返回一个 file 对象,基本语法格式如下:
filehandle = open(filename[, mode[, buffering[, encoding[, errors[, newline]]]]])
- filename 变量是一个包含了要访问的文件路径和名称的字符串;需要加引号如”/Users/macxunlei/Desktop/a.txt”
- mode决定了打开文件的模式:只读(w),只写(r),追加(a)等,默认文件访问模式为只读(r);
b、t、+、u与文件打开模式组合使用,对应二进制模式、文本模式、读写模式、通用换行符;
- buffering可取0、1、>1三种,对应buffer关闭(只适用于二进制模式),1代表line buffer(只适用于文本模式),>1表示初始化的buffer大小
- encoding表示返回的数据采用的解码方式,一般有’utf-8‘或者’gbk‘
- errors一般取strict、ignore;当取strict的时候,字符编码出现问题的时候会报错;当取ignore的时候,编码出现问题,程序会忽略而过继续执行下面的程序
- newline可取None,\n, \r , " , '\r\n' ,用于区分换行符,(只适用于文本模式)
- filehandle 是当前打开的文件的句柄,用于后续对文件进行读写操作



2、文件读取
- filehandle.read(size) 读取size长度的数据
size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回
- filehandle.readline()
从文件中读取单独的一行。换行符为 '\n'。
f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。
- filehandle.readlines()
将返回该文件中包含的所有行。
1 filehandle = open("test.txt","r") 2 3 read_result = filehandle.read(16) 4 print(read_result) 5 filehandle.close() 6 print("读取1024长度的内容结束1") #//可以看到一个字符是一位,包含空格、回车都算一位 7 print() #打印回车以区分,无意义 8 9 print("单独一行的内容开始2") 10 filehandle = open("test.txt","r") #为何重新打开?文件指针在哪里?不重新打开是什么结果 因为上面执行filehandle.close()关闭文件了,不重新打开就不能读取内容; 11 read_result2 = filehandle.readline() 12 print(read_result2) 13 print("单独一行的内容结束2") #可以发现读完一行之后,指针在下一行的开头 14 print() #打印回车以区分,无意义 15 16 print("读取readlines(3)的内容开始") 17 read_result3 = filehandle.readlines(3) #这里发现()内不管是数字几 ,打印的都是指针当前行的内容#这里发现(X)内的数字几表示:如果X<当前行数字,输出当前行;如果X>当前行数字,继续输出到X所在位置的那一行
18 print(read_result3) 19 print("读取readlines(3)的内容结束") 20 print() #打印回车以区分,无意义 21 22 print("读取readlines()的内容开始") 23 read_result3 = filehandle.readlines() #这里知道打印的是指针当前行到剩下的全部内容 24 print(read_result3) 25 print("读取readlines()的内容结束") 26 27 '''运行结果如下: 28 1hello Quectel 29 2 30 读取1024长度的内容结束1 31 32 单独一行的内容开始2 33 1hello Quectel 34 35 单独一行的内容结束2 36 37 读取readlines(3)的内容开始 38 ['2hello NBIoT\n'] 39 读取readlines(3)的内容结束 40 41 读取readlines()的内容开始 42 ['3hello 3G\n', '4hello eMTC\n', '5hello GNSS\n', 'The End'] 43 读取readlines()的内容结束 44 '''
3、文件写入
filehandle.write(string) 将string写入到文件中,然后返回写入的字符数
4、关闭文件
filehandle.close()
当你处理完一个文件后, 调用 filehandle.close() 来关闭文件并释放系统的资源;
如果尝试再调用该文件,则会抛出异常。
1 f = open("test_jodie.txt", "w") 2 num = f.write("Python 是一个非常好的语言。\n是的,的确非常好!!!!!\n") 3 print(num) 4 # 关闭打开的文件 5 f.close() 6 7 #==尝试再次调用=== 8 f = open("test_jodie.txt", "w") #w/w+会覆盖之前写的内容 9 f.write("hi~\n") 10 f = open("test_jodie.txt", "a+") #a+表示追加 11 f.write("nice~\n") 12 13 '''运行结果: 14 hi~ 15 nice~ 16 '''
5、操作例子1
请定义一个函数,分别读取A.txt和B.txt的内容,并比较内容是否一致,将不一致的内容打印到diff.txt文件中
方法1:
1 # 提前准备好三个txt文件 2 # A.txt 和 B.txt 为对比文件 3 # diff.txt 为存储不同内容文件 4 5 # 以读取方式打开两个txt文件 6 f1 = open("A.txt","r") 7 f2 = open("B.txt","r") 8 9 #读取两个txt文件 10 txt1 = f1.read() 11 txt2 = f2.read() 12 print("文件A的内容是:\n" + txt1) 13 print("文件B的内容是:\n" + txt2) 14 # 按行的方式读取txt文件 15 # txt1 = f1.readline() 16 # txt2 = f2.readline() 17 # print("文件A的内容是:\n" + txt1) 18 # print("文件B的内容是:\n" + txt2) 19 20 # 释放两个文件进程---open->read->内容赋值给变量->close 21 f1.close() 22 f2.close() 23 24 #将两个文件中内容按空格分隔开 25 line1 = txt1.split( ) 26 line2 = txt2.split( ) 27 print("文件A的内容分隔后是:" ) 28 print(line1) 29 print("文件B的内容分隔后是:" ) 30 print(line2) 31 32 # 以可读写方式打开 diff.txt 文件 33 outfile = open("diff.txt", "w") 34 35 # 循环遍历1号文件中的元素 36 for i in line1: 37 # 查看1中文件是否在2中存在 38 if i not in line2: 39 outfile.write(i) #上面的只写属性,内容覆盖是指关闭文件后再打开写入内容会覆盖,不关闭文件就不会覆盖 40 outfile.write('\n') #不加\n的话,diff文件的内容就是连再一起的了,不好查看 41 outfile.write("Above content in 1. But not in 2.\n") 42 for j in line2: 43 # 查看2中文件是否在1中存在 44 if j not in line1: 45 outfile.write(j) 46 outfile.write('\n') 47 outfile.write("Above content in 2. But not in 1.\n") 48 outfile.close() 49 print("核对结束") 50 51 52 f3 = open("diff.txt", "r") #如果不关闭文件再打开,指针就在最后,再读就读不到内容了 53 txt3 = f3.read() 54 print("文件diff的内容是:\n" ) 55 print(txt3) 56 f3.close()
方法2:
1 file1 = "A.txt" 2 file2 = "B.txt" 3 f_diff = "diff.txt" 4 # ---------- 对比文件内容,输出差异 5 f1 = open(file1, "r") 6 f2 = open(file2, "r") 7 8 file1 = f1.readlines() 9 file2 = f2.readlines() 10 print("file1的内容是:") 11 print(file1) #这里可以发现,读的txt生成的列表里包含了\n,那么也就说明当有一行有\n有一行没有\n的时候,也会认为这两行不一致 12 print("file2的内容是:") 13 print(file2) 14 #readlines()它读取的是文件中的所有行,以每行为元素形成一个列表,所以不用再另外执行切割了,否则会报错AttributeError: ‘list’ object has no attribute ‘split’ 报错 15 #split()方法作用对象是一个字符串,使用时要注意自己处理的或之前用方法生成的是列表,集合,还是其他的什么,只要最后能转变成字符串就能用split()方法 16 f1.close() 17 f2.close() 18 19 outfile = open(f_diff, "w") 20 flag = 0 21 outfile.write("file1独有的数据:\n") 22 for i in file1: 23 if i not in file2: 24 outfile.write(i) 25 flag = 1 26 outfile.write("file2独有的数据:\n") 27 for i in file2: 28 if i not in file1: 29 outfile.write(i) 30 flag = 1 31 outfile.close() 32 if flag == 1: 33 print("数据存在差异,请仔细核对!") 34 35 outfile = open(f_diff, "r") 36 diff = outfile.read() 37 print(diff) 38 outfile.close()
操作例子2:
将获取的cpu、memory返回到一个文本中,提取文本中的idel数据和avail数据,求平均值
主要结构:
with open('memcount.txt', 'r') as file_mem: lines_mem = file_mem.readlines() # file_mem.readlines() 获取到文件内容 # for line in lines_mem: 逐行对文件内容操作 for line in lines_mem: print(line)
# 定义存档路径 path = "/home/pi/Automation/Metric_Data/{}/{}/{}".format(VersionName, VersionVnumber, test_id) if not os.path.exists(path): os.makedirs(path) # 导出的数据中提取以下字段ilde的值(toptest.txt中)/MemAvailable的值(memcount.txt中)并处理求均值 data_mem_list = [] data_cpu_list = [] with open('memcount.txt', 'r') as file_mem: lines_mem = file_mem.readlines() for line in lines_mem: if 'MemAvailable' in line: data_mem_list.append(int(re.findall('(\d+)', line)[0])) with open('toptest.txt', 'r') as file_cpu: lines_cpu = file_cpu.readlines() for line in lines_cpu: if 'idle' in line: data_cpu_list.append(float(re.findall(' (\d+\.\d+)% idle', line)[0])) print(data_mem_list) print(data_cpu_list) print(sum(data_mem_list)/len(data_mem_list)) print(sum(data_cpu_list)/len(data_cpu_list)) with open('{}/data_mem.txt'.format(path), 'w') as file: file.write('data_mem_list:\n{}'.format(data_mem_list)) with open('{}/data_cpu.txt'.format(path), 'w') as file: file.write('data_cpu_list:\n{}'.format(data_cpu_list)) with open('{}/statistics_处理数据.txt'.format(path), 'w') as file: file.write('CPU:{}%\tMEM:{}kB'.format((100 - sum(data_cpu_list)/len(data_cpu_list)), sum(data_mem_list)/len(data_mem_list)))
(15条消息) Python读取文本内容_SK-Berry的博客-CSDN博客_python读取文本

浙公网安备 33010602011771号