python可以处理什么文件_五.python文件处理

1 #r+ 读写操作,即可读,又可写

2 f=open('test','r+',encoding='utf-8')3 #f.read()

4 f.write("zhangsan") #文件打开直接就写,会覆盖文件开头,写多少字符覆盖多少字符***

5 f.close()6

7 #w+ 写读操作,即可写,又可读,w+特点和w类似,文件不存在会常见,存在会清空打开 *****

8 f=open('test','w+',encoding='utf-8') #w+和w唯一的区别是可以读。

9 #f.read()

10 f.write('11111111111\n')11 f.close()12

13 #a+ 写读操作,即可写,又可读,和a的区别是a+可以读。

14 f=open('test','a+',encoding='utf-8')15 #f.read()

16 f.write('#'*30)17 f.write('\n')18 f.close()19

20 #文件修改,严格意义上讲,文件没有修改的操作,一般修改原理是从源文件读,往目标文件写,再用这个目标文件覆盖源文件以达到修改的效果。

21 #基本原理

22 src_f = open('test','r',encoding='utf-8')23 data =src_f.readlines()24 src_f.close()25

26 dst_f = open('test','w',encoding='utf-8')27 dst_f.writelines(data[0])28 dst_f.close()29

30 #with open 每次打开文件都要关闭,有时候会忘记,with open会自动关闭文件。

31 #with open拷贝

32 with open('test','r+',encoding='utf-8') as src_f,\33 open('test1','w',encoding='utf-8') as dst_f:34 data =src_f.readlines()35 print(data)36 dst_f.writelines(data[0])37

38 #rb 二进制读,这里不指定编码,是因为要求是以二进制的方式读取,硬盘上存的文件是二进制,open打开其实是把二进制放到内存中,指定编码的意思是,打开文件让我们能看得懂,二进制b代表的是字节,按照字节读取。

39

40 想要看到读到的内容41 #字符串----------encode----------->bytes(硬盘) 字符串通过encode存到硬盘,编码形式

42 #bytes-----------decode----------->字符串 硬盘通过decode转换为字符串,解码形式

43

44 f = open('test','rb')45 data =f.read()46 print(data) #输入会有换行符,\r\n是window的换行符,\n是linux的换行符

47 f.close()48

49 #wb 二进制写,如下要进行编码然才能在到到硬盘,bytes是指定字符串编码,不指定编码一定不能存到硬盘 ***

50

51 f = open('test22','wb') #b的方式不能指定编码

52 #f.write('111111\n') #报错TypeError: a bytes-like object is required, not 'str'

53 f.write(bytes('11111\n',encoding='utf-8')) #第一种方法

54 f.write('222222\n'.encode('utf-8')) #第二种方法

55 f.close()56

57 #######其他方法##########

58 #latin-1解决乱码问题,

59 f = open('a.txt','w',encoding='latin-1') #latin-1:如果不知道文件是什么编码,latin-1可以把大部分吸纳出来,遇到问题,可以试试。

60 #看文件是否已经关闭

61 print(f.closed)62 #取的是文件打开的编码

63 print(f.encoding)64 #内存的东西刷新到硬盘上,默认python会每隔固定间隔写到硬盘

65 f.flush()66 #取光标现在所在的位置

67 f.tell()68

69 #windows系统默认是\r\n,不指定newline,python会自动把\r\n统一转换为\n

70 f = open('a.txt','w',encoding='latin-1',newline='')71 #移动光标所在的位置,按照‘字节’移动

72 f.seek()73 #读文件,按照“字符”来读

74 f.read()75 #文件截断 ,开头截取10个字节,其他的全删除。

76 f.truncate(10)77

78 #######seek高级玩法##########

79

80 f = open('seek.txt','rb')81 print(f.tell())82 f.seek(1)83 print(f.tell())84 f.seek(3) #等于3,从头开始算,绝对路径来算

85 print(f.tell())86 f.seek(5,1) #1代表从上一个开始算,相对路径

87 print(f.tell())88 f.seek(-3,2) #2代表倒着读,但第一个参数必须是负数

89 print(f.read())90 print(f.tell())91 f.seek(-5,2) #相对路径倒着读(倒着读用途是在日志处理,从后面读,减少服务器压力)

92 print(f.tell())93

94

95 #######读文件优化##########

96 for i in f.readlines(): #这种方式效率不高,内存占用较大,所有东西读出来,再循环

97 print(i)98

99 #优化(这种方式是,f是文件句柄,读一条看一条,内存占用小)

100 for i inf:101 print(i)102

103 #文件倒序读取,有些时候,类似于日志的大文件,开头对于我们来说并不重要,末尾几天的日志对我们来说有时候很重要,这个时候就可以倒叙读文件,优点是减轻服务的压力

104 #方法(比如读取文件最后一行):

105 f = open('seek.txt','rb')106 for i inf:107 #倒着seek

108 offs=-2 #定义一个阀值,循环阀值,当取到最后一行的时候结束。实际用的时候估算下一行多少字节,尽量循环次数减少

109 whileTrue:110 f.seek(offs,2)111 data = f.readlines() #这里的readlines并不是读取文件所有,而是读取seek那一段的一行

112 if len(data) > 1:113 print('文件最后一行是%s' %(data[-1].decode('utf-8')))114 break

115 offs*=2 #如果不满足一行就把阀值乘以2,生产环境可以自定义调节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值