14.Python之文件操作
Python之文件操作
-
文件操作
- 通过Python中的内置函数open()对文件进行操作。
- 文件操作需要如下几个参数:
- 文件路径是什么:path
- 打开方式(mode)是什么:读、写、追加、读写
- 编码方式(encoding)是什么:UTF-8、GBK、GB2312等,内置函数open()中如果不声明encoding,则默认的编码方式与操作系统相同。
- Python文件操作需要注意的是,以什么样的编码保存的,就必须以什么样的编码打开。
-
文件操作的读
-
'r’ 模式:读文件(操作文本类文件,有五种读取方式)
-
方式一:将文件内容一次性全部读取到文件句柄,文件句柄是一个迭代器(★)
f = open(r'文本文件的路径', mode = 'r', encoding='UTF-8') # encoding只是声明编码方式 content = f.read() # f称之为“文件句柄”,对文件的任何操作都需要通过 文件句柄. 的方式 print(content) f.close()
-
方式二:按照指定的字符个数读取文件内容
f = open(r'文本文件的路径', mode = 'r', encoding='UTF-8') content = f.read(10) # f.read(10)表示读取文件的前10个字符 print(content) f.close()
-
方式三:按照行读取文件内容,读取一行
f = open(r'文本文件的路径', mode = 'r', encoding='UTF-8') content = f.readline() # 注意,每一行内容后都有一个隐藏的换行符:\n print(content) f.close()
-
方式四:按照行读取文件内容,读取多行
f = open(r'文本文件的路径', mode = 'r', encoding='UTF-8') l = f.readlines() # readlines()返回一个列表,列表的每一个元素是文件中的一行。 print(content) f.close()
-
方式五:使用for循环读取文件的每一行,此方法适合操作大文件(★)
f = open(r'文本文件的路径', mode = 'r', encoding='UTF-8') for line in f: print(line) f.close()
-
-
'rb' 模式:以bytes类型读文件(操作非文本类文件(图片、音频、视频),不用声明 encoding,与 'r ' 模式一样,也有五种方式)
-
方式一:将文件内容一次性全部读取到文件句柄,文件句柄是一个迭代器(★)
f = open(r'非文本文件的路径', mode = 'rb') content = f.read() # f称之为“文件句柄”,对文件的任何操作都需要通过 文件句柄. 的方式 print(content) f.close()
-
方式二:按照指定的字符个数读取文件内容
-
方式三:按照行读取文件内容,读取一行
-
方式四:按照行读取文件内容,读取多行
-
方式五:使用for循环读取文件的每一行,此方法适合操作大文件(★)
f = open(r'非文本文件的路径', mode = 'rb') for line in f: print(line) f.close()
-
-
'r+'模式:读写文件(可以对文件进行读、写两种操作)
-
先读后写:读完文件,光标会移至文件内容的最后,写入时,会将内容写入到文件的最后,类似于文件的追加。
f = open(r'读写文件的路径', mode='r+', encoding='UTF-8') content = f.read() f.write('读完文件后,需要写入文件的内容') f.close()
-
先写后读:会先用写的内容覆盖文件的内容,然后再读。不要这样做
-
-
'r+b'模式:以bytes类型读写文件
-
-
文件操作的写
-
'w' 模式:写文件(操作文本类文件,若文件不存在,先创建文件再写入;若文件存在,先清空文件再写入)
f = open(r'待写入的文件路径及文件名', mode = 'w', encoding='UTF-8') f.write('写入一段字符串') f.close()
-
'wb' 模式:以bytes类型写文件(可以操作文本类的文件,但主要用于操作非文本类的文件,用于文件的复制)
# 先以bytes类型读取非文本文件内容 f_1 = open(r'非文本类型文件路径', mode='rb') content = f_1.read() f_1.close() # 再把读取到的数据以bytes类型写入一个新文件,即完成文件的复制 f = open(r'待写入的文件路径及文件名', mode = 'w', encoding='UTF-8') f.write(content) f.close()
-
'w+'模式:读写文件
-
'w+b'模式:以bytes类型读写文件
-
-
文件操作的追加
-
'a' 模式:文件的追加(没有文件,创建文件,追加内容;有文件,在文件最后追加内容)
f = open(r'追加文件的路径', mode='a', encoding='UTF-8') f.write('需要追加的内容') f.close()
-
'ab'模式:以bytes类型进行文件的追加
-
'a+'模式:文件追加并可读
-
'a+b'模式:以bytes类型进行追加并可读
-
-
文件操作的其他模式
-
tell() 获取光标的位置,单位是字节。可以与用断点续传等功能。
f = open(r'文本文件的路径', mode = 'r', encoding='UTF-8') content = f.readline() # 注意,每一行内容后都有一,个隐藏的换行符:\n print(f.tell()) # 可以获取到光标的位置,单位是字节 f.close()
-
seek() 调整光标位置,单位是字节。可以与用断点续传等功能。
f = open(r'文本文件的路径', mode = 'w', encoding='UTF-8') f.seek(30) # 光标从开的0,想后移动30个字节 f.write('需要写入的内容') f.close()
-
flush() 强制刷新(强制保存)
f = open(r'文本文件的路径', mode = 'w', encoding='UTF-8') f.write('需要写入的内容') f.flush() f.close()
-
-
打开文件的另一种方式(★)
-
使用 with 的方式打开文件
# 打开一个文件 with open('需要打开的文件路径', mode='r', encoding='UTF-8') as f: print(f.read()) # 打开多个文件 with open('文件1的路径', mode='r', encoding='UTF-8') as f1,open('文件2的路径', mode='r', encoding='UTF-8') as f2: print(f1.read()) print(f2.read())
-
优点
- 不用手动关闭文件句柄f.close(),文件句柄会自动在一定时间内自动关闭。
- 可同时打开多个文件,且不用关闭句柄。
-
缺点
-
-
文件操作的改(★)
-
现存所有的软件,对文件修改都要经历如下五个步骤
- 以读的模式打开原文件;
- 以写的模式创建一个新文件;
- 将原文件的内容读出来修改成新内容,写入新文件;
- 将原文件在内存中删除;
- 将新文件重命名为原文件。
-
改文件的示例代码
# 改小文件可以通过以下方式 import os # 以读的模式开打一个原文件,以写的模式打开一个新文件 with open('原文件', mode='r', encoding='UTF-8') as f1,open('新文件', mode='w', encoding='UTF-8') as f2: # 将原文件的内容读出来,修改成新内容 old_content = f1.read() new_content = old_content.replace('新内容','旧内容') # 写入新文件 f2.write(new_content) # 将原文件删除 os.remove('原文件') # 将新文件重命名成原文件 os.rename('新文件', '原文件') # 改大文件,为了节省内存,可以通过以下方式 import os # 以读的模式开打一个原文件,以写的模式打开一个新文件 with open('原文件', mode='r', encoding='UTF-8') as f1, open('新文件', mode='w', encoding='UTF-8') as f2: # 对原文件一行一行的读 for line in f1: # 对读出来的一行,若是有需要替换的内容,就用新内容替换 new_line = line.replace('新内容','旧内容') # 改好的行写入新文件 f2.write(new_line) # 没有关闭文件句柄,写文件时不会清空文件 # 将原文件删除 os.remove('原文件') # 将新文件重命名成原文件 os.rename('新文件', '原文件')
-