Python的文件操作

Posted colin1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python的文件操作相关的知识,希望对你有一定的参考价值。

我们用python编写的程序放入到硬盘以永久保存,其中涉及到应用程序来操作硬件,而程序却无法直接操作硬件,需要操作系统作为中介,即操作系统将硬件操作封装成简单的接口供用户/应用程序使用。因此,文件操作通过操作系统供给应用程序来操作硬盘虚拟概念,用户或者应用程序可通过操作文件,将数据永久保存。

首先,简单介绍一个例子
1 f = open(F:pingguo.txt,r,encoding= utf-8)   # 打开文件,将文件赋值给一个变量f
2 data = f.read()     读取文件里面的内容
3 print(data)
4 f.close()       # 关闭文件
通过上面简单例子可以看出,变量f,其实也就是变量f_obj,f_handler,f_h,fh,即文件句柄open()函数是python的内置函数(其内部调用的是windows的系统命令),对文件的操作流程可以简述为:
1,打开文件,产生文件句柄
2,对文件句柄进行操作
3,关闭文件句柄
通过对列表,字典等增删改查一样,文件也有类似操作,但也有很大的不同,接下来分别对文件按读,写,追加等操作。首先是读操作:在python中,读操作为‘r‘,即mode =‘r‘。但对于r模式,mode可以默认不写.

读操作通常由几种读方法,以下一一来介绍。

1. 文件内容全部读取 read()

1 1. 文件内容全部读取  read()
2 f = open(F:诗歌.txt, encoding=utf_8, mode = r)
3 content = f.read()
4 print(content)
5 f.close()

显示结果为:

‘‘‘E:python3.6.5python.exe G:/PythonFile/week1/骑士计划/week_3/day_1/上课内容.py
杨柳青青江水平,
闻郎江上唱歌声。
东边日出西边雨,
道是无情却有情。

Process finished with exit code 0‘‘‘

2. read(n) 按照字符读取

1 f = open(F:诗歌.txt,encoding= utf-8, mode = r)
2 content = f.read(10)
3 print(content)
4 f.close()
# 输出结果为:
‘‘‘杨柳青青江水平,
   闻  
从输出结果可以看出,在读模式下,是按照字符读取数据,其中第一行最后一个空格也占用一个字符。

3 按行读取内容:readline()

1 f = open(F:诗歌.txt,encoding= utf-8, mode=r)
2 print(f.readline().strip())
3 print(f.readline().strip())
4 print(f.readline().strip())
5 print(f.readline().strip())
6 print(f.readline().strip())
7 f.close()

结果:

杨柳青青江水平,
闻郎江上唱歌声。
东边日出西边雨,
道是无情却有情。
每一次只读取一行代码,若没有strip()函数,则每读取一行都会空一行再读取下一行,当readline()多了,不会报错

4 按行读取,并返回一个list

1 4 按行读取,并返回一个list
2 f = open(F:诗歌.txt,encoding=utf-8,mode=r)
3 content = f.readlines()     # [‘杨柳青青江水平,
‘, ‘闻郎江上唱歌声。
‘, ‘东边日出西边雨,
‘, ‘道是无情却有情。‘]
4 print(content)
5 f.close()
输出结果为一个列表,每一行内容代表一个元素,每一行最后都有一个换行符

5 for 循环


1 f = open(F:诗歌.txt,encoding=utf-8,mode=r)
2 for line in f:
3     print(line)
4 f.close()

‘‘‘杨柳青青江水平,

闻郎江上唱歌声。

东边日出西边雨,

道是无情却

 

可以看出,循环输出是每一行每一行执行,有空行,为了将空行删除使用line.strip()函数,如下:

1 f = open(F:诗歌.txt,encoding=utf-8,mode=r)
2 for line in f:
3     print(line.strip())
4 f.close()

一般在处理大量数据情况下,建议使用for循环,主要是在大量数据的文件下,用其他方法读是将文件所有数据都放入内存,将导致占用内存空间变大,消耗内存,而for循环则是将数据一行一行读入内存,每读完一行后就销毁,节省了内存的消耗。

rb 文件操作中凡是带b字母,都是与非文字类文件相关的


# 与文字类相关读取方式

1 f = open(F:诗歌.txt,mode=rb)
2 content = f.readlines()
3 print(content)
4 f.close()
bytes方式进行读取,因此,不需要encode = ‘utf-8‘

# 输出结果以bytes方式进行输出:
‘‘‘‘[b‘xe6x9dxa8xe6x9fxb3xe9x9dx92xe9x9dx92xe6xb1x9fxe6xb0xb4xe5xb9xb3xef‘
b‘xbcx8c ‘, b‘xe9x97xbbxe9x83x8exe6xb1x9fxe4xb8x8axe5x94xb1xe6xadx8c‘
b‘xe5xa3xb0xe3x80x82 ‘, b‘xe4xb8x9cxe8xbexb9xe6x97xa5xe5x87xbaxe8
xbfxe8xbexb9xe9x9bxa8xefxbcx8c ‘, b‘xe9x81x93xe6x98xafxe6x97xa0xe6‘
b‘x83x85xe5x8dxb4xe6x9cx89xe6x83x85xe3x80x82‘]...

与非文字类读取文件相关:如读取图片


1 f = open(F:不行.jpg,mode=rb)
2 content = f.read()
3 print(content)    # b‘xffxd8xffxe0x00x10JFIFx00x01x01x00x00Hx00Hx00x00xf.......
4 f.close()

 

同理,只读取部分数据使用read(n)


1 f = open(F:不行.jpg,mode=rb)
2 content = f.read(9)      # b‘xffxd8xffxe0x00x10JFI‘  模式下,按照字节读取
3 print(content)
4 f.close()

r+ 读写:先读后追加

1 f = open(F:诗歌.txt,encoding=utf-8,mode=r+)
2 content = f.read(3)
3 print(content)
4 f.write(666)
5 f.close()
操作为先读取文件内3个字符后,光标移动到文件内容最后,再添加内容‘666‘
1 f = open(诗歌.txt,encoding=utf-8,mode=r+)
2 f.write(深圳你好!)
3 f.close()
‘‘‘深圳你好!水平,
闻郎江上唱歌声。
东边日出西边雨,
道是无情却有情。‘‘‘

 从结果可知,不读而直接写会导致光标直接从开始覆盖。


1 # 报错
2 # f = open(‘诗歌.txt‘,mode=‘rb‘)
3 # # content = f.read(10)
4 # # print(content)
5 # f.write(‘666‘)
6 # f.close()

写操作


w :

# 若没有文件,则先创建文件后再写内容
# 若有文件,则先清空原文件内容,再写入新内容。
1 f = open(诗歌.txt,encoding=utf-8,mode=w)
2 f.write(深圳市南山区世外桃源。。。)
3 f.close()

wb:

1 f = open(F:不行.jpg,mode=rb)
2 content = f.read()    #  将图片信息保存到变量
3 print(content)   # b‘xffxd8xffxe0x00x10JFIF........
4 f1 = open(不行1.jpg,mode=wb)
5 f1.write(content)
6 f.close()
7 f1.close()
非文字文件,先以bytes格式进行读出(rb),再用bytes格式进行写入(wb)

w+ 写读

1 f = open(诗歌.txt,encoding=utf-8,mode=w+)
2 f.write(深圳市南山区世外桃源。。。)  # 先清空内容
3 f.seek(3)         # 移动光标位置,是按字节移动,在utf-8模式下,每个文字移动三个字节,若为非3的倍数,则报错
4 content = f.read()
5 print(content)
6 f.close()

追加

a

没有文件时,将创建文件并将内容写进去
有文件时,直接在文件的最后面追加内容
1 f = open(t1.txt,encoding=utf-8,mode=a)
2 f.write(
你是我的小丫小苹果。。。。)
3 f.close()
其他方法如: ab a+ a+b这里就不介绍了。

其他方法

 


 
 

 




















以上是关于Python的文件操作的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

常用python日期日志获取内容循环的代码片段

使用 Python 代码片段编写 LaTeX 文档

VSCode 如何操作用户自定义代码片段(快捷键)

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程