Python 文件操作详解


本文摘自php中文网,作者巴扎黑,侵删。

这篇文章主要介绍了Python 文件操作的详解及实例的相关资料,希望通过本文大家能够理解掌握Python 文件操作的知识,需要的朋友可以参考下

Python 文件操作的详解及实例

一、文件操作

1、对文件操作流程

  • 打开文件,得到文件句柄并赋值给一个变量

  • 通过句柄对文件进行操作

  • 关闭文件

现有文件如下:


1

2

3

4

5

6

7

8

9

10

11

昨夜寒蛩不住鸣。

惊回千里梦,已三更。

起来独自绕阶行。

人悄悄,帘外月胧明。

白首为功名,旧山松竹老,阻归程。

欲将心事付瑶琴。

知音少,弦断有谁听。

 

f = open('小重山') #打开文件

data=f.read()#获取文件内容

f.close() #关闭文件

注意:if in the win,hello文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要f=open(‘hello',encoding='utf8'),hello文件如果是gbk保存的,则直接打开即可。

2、文件打开模式  

Character Meaning


1

2

3

4

5

6

7

8

'r'    open for reading (default)

'w'    open for writing, truncating the file first

'x'    create a new file and open it for writing

'a'    open for writing, appending to the end of the file if it exists

'b'    binary mode

't'    text mode (default)

'+'    open a disk file for updating (reading and writing)

'U'    universal newline mode (deprecated)

先介绍三种最基本的模式:


1

2

3

4

5

# f = open('小重山2','w') #打开文件

# f = open('小重山2','a') #打开文件

# f.write('莫等闲1\n')

# f.write('白了少年头2\n')

# f.write('空悲切!3')

3、文件具体操作


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

f = open('小重山') #打开文件

# data1=f.read()#获取文件内容

# data2=f.read()#获取文件内容

#

# print(data1)

# print('...',data2)

# data=f.read(5)#获取文件内容

 

# data=f.readline()

# data=f.readline()

# print(f.__iter__().__next__())

# for i in range(5):

#   print(f.readline())

 

# data=f.readlines()

 

# for line in f.readlines():

#   print(line)

 

 

# 问题来了:打印所有行,另外第3行后面加上:'end 3'

# for index,line in enumerate(f.readlines()):

#   if index==2:

#     line=''.join([line.strip(),'end 3'])

#   print(line.strip())

 

#切记:以后我们一定都用下面这种

# count=0

# for line in f:

#   if count==3:

#     line=''.join([line.strip(),'end 3'])

#   print(line.strip())

#   count+=1

 

# print(f.tell())

# print(f.readline())

# print(f.tell())#tell对于英文字符就是占一个,中文字符占三个,区分与read()的不同.

# print(f.read(5))#一个中文占三个字符

# print(f.tell())

# f.seek(0)

# print(f.read(6))#read后不管是中文字符还是英文字符,都统一算一个单位,read(6),此刻就读了6个中文字符

 

#terminal上操作:

f = open('小重山2','w')

# f.write('hello \n')

# f.flush()

# f.write('world')

 

# 应用:进度条

# import time,sys

# for i in range(30):

#   sys.stdout.write("*")

#   # sys.stdout.flush()

#   time.sleep(0.1)

 

# f = open('小重山2','w')

# f.truncate()#全部截断

# f.truncate(5)#全部截断

 

# print(f.isatty())

# print(f.seekable())

# print(f.readable())

 

f.close() #关闭文件

接下来我们继续扩展文件模式:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

# f = open('小重山2','w') #打开文件

# f = open('小重山2','a') #打开文件

# f.write('莫等闲1\n')

# f.write('白了少年头2\n')

# f.write('空悲切!3')

 

 

# f.close()

 

#r+,w+模式

# f = open('小重山2','r+') #以读写模式打开文件

# print(f.read(5))#可读

# f.write('hello')

# print('------')

# print(f.read())

 

 

# f = open('小重山2','w+') #以写读模式打开文件

# print(f.read(5))#什么都没有,因为先格式化了文本

# f.write('hello alex')

# print(f.read())#还是read不到

# f.seek(0)

# print(f.read())

 

#w+与a+的区别在于是否在开始覆盖整个文件

 

 

# ok,重点来了,我要给文本第三行后面加一行内容:'hello 岳飞!'

# 有同学说,前面不是做过修改了吗? 大哥,刚才是修改内容后print,现在是对文件进行修改!!!

# f = open('小重山2','r+') #以写读模式打开文件

# f.readline()

# f.readline()

# f.readline()

# print(f.tell())

# f.write('hello 岳飞')

# f.close()

# 和想的不一样,不管事!那涉及到文件修改怎么办呢?

 

# f_read = open('小重山','r') #以写读模式打开文件

# f_write = open('小重山_back','w') #以写读模式打开文件

 

# count=0

# for line in f_read:

  # if count==3:

  #   f_write.write('hello,岳飞\n')

  #

  # else:

  #   f_write.write(line)

 

 

  # another way:

  # if count==3:

  #

  #   line='hello,岳飞2\n'

  # f_write.write(line)

  # count+=1

 

# #二进制模式

# f = open('小重山2','wb') #以二进制的形式读文件

# # f = open('小重山2','wb') #以二进制的形式写文件

# f.write('hello alvin!'.encode())#b'hello alvin!'就是一个二进制格式的数据,只是为了观看,没有显示成010101的形式

注意1: 无论是py2还是py3,在r+模式下都可以等量字节替换,但没有任何意义的! 

注意2:有同学在这里会用readlines得到内容列表,再通过索引对相应内容进行修改,最后将列表重新写会该文件。

这种思路有一个很大的问题,数据若很大,你的内存会受不了的,而我们的方式则可以通过迭代器来优化这个过程。 

补充:rb模式以及seek

在py2中:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

#昨夜寒蛩不住鸣.

 

f = open('test','r',) #以写读模式打开文件

 

f.read(3)

 

# f.seek(3)

# print f.read(3) # 夜

 

# f.seek(3,1)

# print f.read(3) # 寒

 

# f.seek(-4,2)

# print f.read(3) # 鸣

在py3中:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

# test:

昨夜寒蛩不住鸣.

 

f = open('test','rb',) #以写读模式打开文件

 

f.read(3)

 

# f.seek(3)

# print(f.read(3)) # b'\xe5\xa4\x9c'

 

# f.seek(3,1)

# print(f.read(3)) # b'\xe5\xaf\x92'

 

# f.seek(-4,2)

# print(f.read(3))  # b'\xe9\xb8\xa3'

 

#总结: 在py3中,如果你想要字符数据,即用于观看的,则用r模式,这样我f.read到的数据是一个经过decode的

#   unicode数据; 但是如果这个数据我并不需要看,而只是用于传输,比如文件上传,那么我并不需要decode

#   直接传送bytes就好了,所以这个时候用rb模式.

 

#   在py3中,有一条严格的线区分着bytes和unicode,比如seek的用法,在py2和py3里都是一个个字节的seek,

#   但在py3里你就必须声明好了f的类型是rb,不允许再模糊.

 

#建议: 以后再读写文件的时候直接用rb模式,需要decode的时候仔显示地去解码.

4、with语句

为了避免打开文件后忘记关闭,可以通过管理上下文,即:


1

2

with open('log','r') as f:

    pass

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:


1

2

with open('log1') as obj1, open('log2') as obj2:

  pass2

以上就是Python 文件操作详解的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python学成后做什么

Python idle怎么生成程序文件

Python input是什么意思

Python cv2模块怎么安装

anaconda是什么?

人工智能为什么用Python

Python详细安装方法

Python终端会话是什么

Python破解字符串找茬游戏实现方法

Python是哪个国家的人开发的语言

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...