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读取文本

 

posted @ 2021-10-27 11:12  小鱼小鱼hi  阅读(189)  评论(0)    收藏  举报