07 Day Python之文件操作

文件操作

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

一、打开文件

1、文件句柄方式

 1 # 1. 打开文件,得到文件句柄并赋值给一个变量
 2 f = open('target_file.txt', mode='r', encoding='utf-8')
 3 
 4 # 2. 通过句柄对文件进行操作
 5 content = f.read()
 6 
 7 # 3.输出读取到的结果
 8 print(content)
 9 
10 # 4. 关闭文件
11 f.close()
12 
13 >>> 文件中的内容:
14 >>> python
15 >>> java
View Code

2、上下文方式

1 # 1. with关键字引导上下文方式打开文件,并将句柄赋予别名f
2 with open('target_file.txt', mode='r', encoding='utf-8') as f:
3 
4 # 2. 通过句柄对文件进行操作
5         content = f.read()
6 
7 # 3.输出读取到的结果,用with上下文方式对文件进行操作会在结束操作时默认关闭文件,不必要主动close()
8         print(content)
View Code

二、操作文件

1、读

 1 # 此处target_file.txt文件中原始内容为:人生苦短,我用python
 2 # ①r——只读,不存在报错
 3 with open('target_file.txt', mode='r', encoding='utf-8') as f:
 4     content = f.read()
 5     print(content)
 6 >>> 人生苦短,我用python
 7 
 8 # ②rb——以bytes类型读
 9 with open('target_file.txt', mode='rb') as f:
10     content = f.read()
11     print(content)
12 >>> b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8python'
13 
14 # ③r+——读写,不存在不会创建,写会覆盖之前内容
15 
16 追加:#因为先读,光标会移动到后面。所以会追加
17 with open('target_file.txt', mode='r+',encoding='utf-8') as f:
18     content = f.read()
19     f.write('\n新添加:Life is short , I use python')
20     print(content)
21 >>> 人生苦短,我用python
22 # ④target_file.txt中的内容为:
23 >>> 人生苦短,我用python
24 >>> 新添加:Life is short , I use python
25 
26 覆盖:#光标在前面,所以直接覆盖。按照字符覆盖。
27 with open('target_file.txt', mode='r+',encoding='utf-8') as f:
28     f.write('\n新添加:Life is short , I use python')
29 
30 
31 #⑤r+b——以bytes类型读写
32 with open('target_file.txt', mode='r+b') as f:
33     content = f.read()
34     f.write('\n新添加:Life is short , I use python'.encode('utf-8'))
35     print(content)
36 >>> b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8python'
37 target_file.txt中的内容为:
38 >>> 人生苦短,我用python
39 >>> 新添加:Life is short , I use python
View Code

2、写

 1 # 此处target_file.txt文件中原始内容为空,需要向其中写入:人生苦短,我用python
 2 # ①w——只写,不存在则创建,存在则清空再写
 3 with open('target_file.txt', mode='w', encoding='utf-8') as f:
 4     content = f.write('人生苦短,我用python')
 5 # target_file.txt中的内容为:
 6 >>> 人生苦短,我用python
 7 
 8 
 9 # ②x——只写,不存在则创建,存在则报错
10 with open('target_file.txt', mode='x', encoding='utf-8') as f:
11     content = f.write('人生苦短,我用python')
12 # target_file.txt存在:
13 >>> Traceback (most recent call last):
14 >>>    File "D:/python_fullstack_s9/day8/practice.py", line 94, in <module>
15 >>>      with open('target_file.txt', mode='x', encoding='utf-8') as f:
16 >>>  FileExistsError: [Errno 17] File exists: 'target_file.txt'
17 # target_file.txt不存在:
18 >>> 人生苦短,我用python
19 
20 # # ③wb——以bytes类型写
21 with open('target_file.txt', mode='wb') as f:
22     content = f.write('人生苦短,我用python'.encode('utf-8'))
23 >>> 人生苦短,我用python
24 
25 # # ④w+——写读,不存在则创建,写会覆盖之前的内容
26 with open('target_file.txt', mode='w+') as f:
27     content = f.write('hello,world')
28     f.seek(0) #移动光标到最前
29     date = f.read()
30     print(date)
31 >>>hello,world
32 # target_file.txt中的内容为:
33 >>> hello,world
34 
35 # # ⑤w+b——以bytes类型写读
36 with open('target_file.txt', mode='w+b') as f:
37     content = f.write('hello,world'.encode('utf-8'))
38     date = f.read()
39     print(date)
40 >>> b''
41 # target_file.txt中的内容为:
42 >>> hello,world
View Code

3、追加

 1 # 此处target_file.txt文件中原始内容为:人生苦短,我用python,需要在后面添加'谁用谁知道'内容
 2 # ①a——追加,不存在则创建,存在则追加
 3 with open('target_file.txt', mode='a', encoding='utf-8') as f:
 4     content = f.write('谁用谁知道')
 5 target_file.txt中的内容为:
 6 >>> 人生苦短,我用python谁用谁知道
 7 
 8 # ②ab——以bytes类型追加
 9 with open('target_file.txt', mode='ab') as f:
10     content = f.write('谁用谁知道'.encode('utf-8'))
11 >>> 人生苦短,我用python谁用谁知道
12 
13 # ③a+——可读可写,不存在则创建,写则追加
14 with open('target_file.txt', mode='a+',encoding='utf-8') as f:
15     content = f.write('谁用谁知道')
16     f.seek(0)
17     date = f.read()
18     print(date)
19 >>> 人生苦短,我用python谁用谁知道
20 
21 # ④a+b——以bytes类型可读可写
22 with open('target_file.txt', mode='a+b') as f:
23     content = f.write('谁用谁知道'.encode('utf-8'))
24     f.seek(0)
25     date = f.read()
26     print(date)
27 >>> b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8python\xe8\xb0\x81\xe7\x94\xa8\xe8\xb0\x81\xe7\x9f\xa5\xe9\x81\x93'
28 # target_file.txt中的内容为:
29 >>> 人生苦短,我用python谁用谁知道
View Code

4、文件修改

python没有提供直接修改文件的函数,只能新建文件,将源文件的内容修改完成后写入新文件中,再把原文件删除,新文件重命名

 1 import os
 2 
 3 with open('源文件', encoding='utf-8') as f, open('源文件.bak', mode='w', encoding='utf-8') as f_w:
 4     for i in f:
 5         if '源文件' in i:
 6             i = i.replace('源文件', '更改后的源文件')
 7         f_w.write(i)
 8 
 9 os.remove('源文件')
10 os.rename('源文件.bak','源文件')
View Code

5、其他操作

① seek() 移动光标指针位置

seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

② tell() 返回当前指针所在的位置

tell对于英文字符就是占一个,中文字符占三个,参数表示的是字节数区分与read()的不同.

③ truncate() 截断文件

truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

④ readline() 读取一行

⑤ readlines() 读取多行,返回为列表

⑥ readable() 文件是否可读

⑦ writeline() 写入一行

⑧ writelines() 写入多行

⑨ writable() 文件是否可读

⑩ closed() 文件是否关闭

⑪ encoding=’utf-8’ 如果文件打开模式为b,则没有该属性

⑫ flush() 立刻将文件内容从内存刷到硬盘

⑬ for循环文件句柄

1 with open('target_file.txt', mode='r',encoding='utf-8') as f:
2     for i in f:
3         print(i)
4 >>> 人生苦短,我用python
5 >>> 谁用谁知道
View Code

 

posted @ 2020-04-04 17:27  kylindemi  阅读(149)  评论(0)    收藏  举报