python—文件处理

文件相关操作

计算机系统分为:计算机硬件,操作系统,应用程序三部分。

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,应用程序是无法直接操作硬件的,这就用到了操作系统。
操作系统把复杂的硬件操作封装成简单的接口给用户
/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来

 【注】

    # 在同一个文件夹下(‘zhouyuan’这个文件与‘文件处理.py'文件在同一处)直接可以open加文件名。【】

    #Windows操作系统是gbk编码,而pycharm是默认utf-8编码,open函数解锁当前操作系统的编码,gbk不能解码utf-8编码的文件。

    #在文件夹中编写文件pycharm是自动保存的。

    #对于文件是可以在建立文件是修改它的编码方式的,例如,在pycharm的右下角,默认的utf-8编码改成与Windows一致的gbk编码,就可以不用encoding='utf-8' 修改解码方式与pycharm一致了。

    #什么是句柄?类比于应用程序无法直接去操作硬盘上的数据,此时操作系统需要提供一个句柄,并复制给一个变量。

文件句柄 = open('文件路径', '模式')

    #关闭文件 f.close()

1 f=open('zhoutao',encoding='utf-8')
2 data=f.read()
3 print(data)
4 f.close()

    #文件处理流程:

1 文件处理流程:
2  1.打开文件,得到文件句柄并赋值给一个变量
3  2. 通过句柄对文件进行操作
4  3. 关闭文件

#资源回收:
打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:
1、f.close() #回收操作系统级打开的文件
2、del f #回收应用程序级的变量

其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,
而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f=open('a.txt','r',encoding='utf-8')

 【1】文件处理读操作 (read(),readline(),readable(),readlines()

 1 f=open('zhoutao',‘r’)
 2 # data=f.read()
 3 # print(data)
 4 print(f.readable())  #readable()是否可读,结果是True False
 5 print(f.readline())   #readline()读取一行
 6 print(f.readline())
 7 print(f.readline())
 8 f.close()
 9 #结果:True
10 #        周涛
11 #        zhou
12 #        yuan
13 
14 f=open('zhoutao')
15 data=f.read()
16 print(data)
17 print(f.readable()) 
18 print(f.readline())   #最后游标已经到了最后一行,再readline已经没有结果
19 f.close()
20 #结果:周涛
21 #    zhou
22 #    yuan
23 #
24 #    True
25 
26 f=open('zhoutao')
27 data=f.readlines()  #readlines()每行作为一个字符串放入列表中
28 print(data)
29 f.close()
30 #结果:['周涛
', 'zhou
', 'yuan
', '涛']

  【2】文件处理写操作(write(),writelines())(标明是'w'写模式,如果原文件有内容则会清空原内容,如果原文件不存在则会自动新建一个文件)

 1 f=open('zhouyuan','w',encoding='utf-8')
 2 # f.read()
 3 f.write('周圆最美
')
 4 f.write('周涛最丑
')
 5 f.writelines(['666
','888
','999
'])   #文件内容只能是字符串
 6 f.close()
 7 #结果:周圆最美
 8 #     周涛最丑
 9 #     666
10 #     888
11 #     999

   【3】‘a’追加模式('a'直接追加到文件最后)

1 f=open('zhouyuan','a',encoding='utf-8')
2 f.write('写到文件最后')
3 #结果:周圆最美
4 #     周涛最丑
5 #     666
6 #     888
7 #     999
8 #     写到文件最后

   【4】with使文件打开自动关闭

1 with open('zhouyuan','w') as f:
2     f.write('666
')
3 #结果:将‘zhouyuan’里面的内容改成了‘666’

   【5】文件的修改

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
 1 方法一:
 2 import os
 3 
 4 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
 5     data=read_f.read() #全部读入内存,如果文件很大,会很卡
 6     data=data.replace('alex','SB') #在内存中完成修改
 7 
 8     write_f.write(data) #一次性写入新文件
 9 
10 os.remove('a.txt')
11 os.rename('.a.txt.swap','a.txt')
12 
13 方法二:
14 import os
15 
16 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
17     for line in read_f:
18         line=line.replace('alex','SB')
19         write_f.write(line)
20 
21 os.remove('a.txt')
22 os.rename('.a.txt.swap','a.txt')

文件处理b模式

 【b方式不能指定编码,b表示原生二进制字节形式

1 f=open('zhouyuan','rb')
2 data=f.read()
3 #‘字符串------encode-------bytes’
4 #bytes-------decode-------‘字符串’
5 print(data)
6 print(data.decode('utf-8'))
7 #结果:b'666
'  #【b表示原生二进制字节形式】
8 #        666
1 f=open('zhouyuan','wb')
2 f.write(bytes('你好漂亮
',encoding='utf-8'))    #字符串以utf-8编码成字节
3 f.write('周圆'.encode('utf-8'))
4 #结果:你好漂亮
5 #     周圆
1 f=open('zhouyuan','ab')
2 f.write('小仙女'.encode('utf-8'))
3 #结果:你好漂亮
4 #     周圆小仙女

文件操作其他方法

1 f=open('a.txt','w',encoding=' gbk')
2 f.write('nihao')
3 print(f.closed)   #判断文件是否关闭
4 print(f.encoding) #显示编码,显示打开的编码,与文件以什么编码存入无关
5 f.flush()  #自动保存,从内存中到硬盘。不需要人工保存
6 print(f.tell())  #显示光标位置在哪
7 #结果:False
8 #     gbk
9 #     5
原文地址:https://www.cnblogs.com/zhouyuan666/p/9513170.html