python文件操作

文件操作

一、初识文件操作

'''
参数说明:
file 变量自己取名(也叫文件句柄,对文件的任何操作都得通过:句柄.方式也就是调用系统函数)
open:python内置封装的函数
r (r'D:	est.txt'): 加上这个就能识别路径,不加有可能会报错,或者再加一个(D:\test.txt)
mode:模块 r、rb、   少用:r+b、r+(写读) 四种模式都有下面的读取方式
encoding:编码方式,Windows默认gbk,Linux(mac)默认utf-8
file.close(): 关闭文件,每次对文件操作结束都得关闭它
'''

'''
文件操作三部曲:
1、打开文件
2、对文件句柄进行相应的操作
3、关闭文件
'''

例子:
file = open(r'D:	est.txt',mode='r',encoding='utf-8')
content = file.read()
print(content)
file.close()

二、文件操作之读

2.1、全读(r):read

文件内容:
'''
高圆圆
刘亦菲
张柏芝
杨紫
王菲
'''
#如果在同一个目录下,直接写文件名称即可,如果不是就写全路径
#mode 默认就是r,可如果单纯读文件,可 省略不写
file = open('文件的读.txt',encoding='utf-8',mode='r')
txt = file.read()
file.close()
print(txt)

2.2、按照字符读取(r):read(n)

#读取第三个
file = open('文件的读.txt',encoding='utf-8',mode='r')
txt = file.read(3)
file.close()
print(txt)

2.3、按照一行一行读(r):readline

file = open('文件的读.txt',encoding='utf-8',mode='r')
txt = file.readline()
file.close()
print(txt)

2.4、返回一个列表(r):readlines

#返回的列表的每一个元素,对应源文件的每一行
file = open('文件的读.txt',encoding='utf-8',mode='r')
txt = file.readlines()
file.close()
print(txt)
#['高圆圆
', '刘亦菲
', '张柏芝
', '杨紫
', '王菲
']

2.5、for循环读取(r)

file = open('文件的读.txt',encoding='utf-8',mode='r')
for i in file:
    print(i)

2.6、非文本类型的读(rb):

#文件放到同目录下
file = open('test.jpg',mode='rb')
print(file.read())
file.close()
#输出一堆b'xffxd8xffxe0x00x10JFIFx00x01x01x00x00x01x00x01x00x00xf

三、文件操作之写

  • w:写
  • wb:操作非文本类的文件
  • w+:写读 (少用)
  • w+b:以字节类型写读(少用)

3.1、文件的写:w

#不写路径默认在当前目录下
'''
参数详解:
f:句柄
open:调用的函数
encoding:编码类型
mode:写的方式
f.write:写的内容
f.close 关闭文件
'''
f = open('随意写点',encoding='utf-8',mode='w')
f.write('随意写点呗,你今天顺利吗')
f.close()

#再次以这个文件名写入文件,会覆盖
#或者可以理解成,原文件有内容先清空,再写入
f = open('随意写点',encoding='utf-8',mode='w')
f.write('Y导,你今天顺利吗')
f.close()

3.2、文件的写:wb

#先读,再写---copy
file = open('test.jpg',mode='rb')
file1 = open('test1.jpg',mode='wb')
file1.write(file.read())
file.close()
file1.close()

四、文件操作之追加

  • a:追加
  • ab:以字节类型追加
  • a+:追加并可读
  • a+b:少用
  • 追加:文件存在就在后面添加,没有就新建一个把内容写进去

4.1、追加:a

file = open('文件的追加.txt',encoding='utf-8',mode='a')
file.write('随意加点aaa')
file.close() 

五、 文件操作的其他模式

  • 带+号的模式
  • r+, 读写【可读,可写】:也就是在读文件的时候也可以写文件,写的时候是追加不是覆盖
  • w+,写读【可写,可读】:写的时候可以读
  • a+, 写读【可写,可读】:追加的时候可以读
假装总结:
#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】

#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb 
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

#3,‘+’模式(就是增加了一个功能)
r+, 读写【可读,可写】
w+,写读【可写,可读】
a+, 写读【可写,可读】

#4,以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】

代码演示:r+ (先读再追加,顺序不能错)

#这个文件得存在,要不然会报错
f = open('文件的读写(追加)',encoding='utf-8',mode='r+')
f.write('文件的读写,相当于追加')
f.close()

image-20200830163539853

代码演示:w+ (直接覆盖了)

f = open('文件的写读',encoding='utf-8',mode='w+')
f.write('文件的写读aaa')
print(f.read())
f.close()

代码演示:a+ (在后面追加)

f = open('文件的a+',encoding='utf-8',mode='a+')
f.write('c')
print(f.read())
f.close()

六. 文件操作的其他功能

6.1、read(n)
  • 文件打开方式为文本模式时,代表读取n个字符
  • 文件打开方式为b模式时,代表读取n个字节
6.2、 seek()
  • seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数
  • 通常我们使用seek都是移动到开头或者结尾
  • 移动到开头:seek(0)
  • 移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
  • 说白了就是调整光标位置

代码演示:

f = open("文件的写读", mode="r+", encoding="utf-8")
# 光标移动到开头,所以读取就从头开始读取
f.seek(0)
# 读取内容, 此时光标移动到结尾
content = f.read()
print(content)

# 再次将光标移动到开头
f.seek(0)

# 将光标移动到结尾,读取内容、什么都没有
f.seek(0, 2)

# 读取内容. 什么都没有
content2 = f.read()
print(content2)

# 移动到开头
f.seek(0)

# 写入信息. 此时光标在9 中文3 * 3个 = 9
f.write("张国荣")
f.flush()
f.close()
6.3、tell()
  • 使用tell()可以帮我们获取当前光标在什么位置
  • 单位:字节
  • f.flush() 强制刷新
  • 追加之后,光标会在尾部,这时候就得调节光标,这样print才有内容
    代码演示:
f = open("文件的写读", mode="r+", encoding="utf-8")
# 将光标移动到结尾
f.seek(0, 2)

# 读取内容. 什么都没有
content2 = f.read()
print(content2)

# 移动到开头
f.seek(0)

# 写入信息. 此时光标在9 中⽂文3 * 3个 = 9
f.write("张国荣")

# 光标位置9
print(f.tell())
f.flush()
f.close()

7、打开文件的其他方式

  • 另一种方式:with open() as .... 的形式,那么这种形式有什么好处呢?
  • 优点1:不用手动开关句柄
  • 优点2:可以在同一个地方操作几个文件
  • 缺点:虽然使用with语句方式打开文件,不用你手动关闭文件句柄,比较省事儿,但是依靠其自动关闭文件句柄,是有一段时间的,这个时间不固定,所以这里就会产生问题,如果你在with语句中通过r模式打开t1文件,那么你在下面又以a模式打开t1文件,此时有可能你第二次打开t1文件时,第一次的文件句柄还没有关闭掉,可能就会出现错误,他的解决方式只能在你第二次打开此文件前,手动关闭上一个文件句柄。
# 1,利用with上下文管理这种方式,它会自动关闭文件句柄。
with open('t1',encoding='utf-8') as f1:
    f1.read()
    
# 2,一个with 语句可以操作多个文件,产生多个文件句柄。
with open('t1',encoding='utf-8') as f1,
        open('Test', encoding='utf-8', mode = 'w') as f2:
    f1.read()
    f2.write('惺惺惜惺惺')

八、文件的修改

​ 文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

​ 手动创建一个文件:

#内容:
我是原文件

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

文件的修改步骤:
'''
1、以读的模式打开一个文件
2、以写的模式创建一个新文件
3、把原文件的内容读取出来、写到新文件中
4、删除原文件
5、把新文件重命名为原文件
'''
方式一:
import os  # 调用系统模块
#以读的模式打开一个文件
file1 = open('原文件.txt',encoding='utf-8',mode='r')
ywj = file1.read()
file1.close()
#以写的模式创建一个新文件
file2 = open('新文件.txt', encoding='utf-8', mode='w')
file2.write(ywj)
file2.close()
# 删除原文件
os.remove('原文件.txt')

#将新建的文件重命名为原文件
os.rename('新文件.txt','原文件.txt')


'''
1、以读的模式打开一个文件
2、以写的模式创建一个新文件
3、把原文件的内容读取出来修改成新的内容、写到新文件中()
4、删除原文件
5、把新文件重命名为原文件
'''
#方式二
# 调用系统模块
import os
with open('原文件.txt',encoding='utf-8') as file1, 
    open('新文件.txt',mode='w',encoding='utf-8') as file2:
    # 3、把原文件的内容读取出来、写到新文件中
    ywj = file1.read()
    new_ywj = ywj.replace('A','S')
    file2.write(new_ywj)
#删除原文件
os.remove('原文件.txt')
#重命名
os.rename('新文件.txt','原文件.txt')

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os
with open('原文件.txt') as read_f,open('新文件.txt') as write_f:
    for line in read_f:
        line=line.replace('alex','SB')
        write_f.write(line)
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 

感谢原博主:https://www.cnblogs.com/jin-xin/articles/8183203.html

原文地址:https://www.cnblogs.com/hsyw/p/13586057.html