文件操作

文件操作

参考博客

1.书写方式

f = open('数据类型练习.py','r',encoding='utf8')
content = f.read()
print(content)
f.close()
	 # 要打开的文件格式一定要书写正确,注意是否需要添加后缀
上述代码各个部分解释:

    f: 就是一个变量,称作文件句柄。

    open:是Python调用的操作系统(windows,linux,等)的功能。

    '数据类型练习.py': 这个是文件的路径。

    mode: 就是定义你的操作方式:r为读模式。

    encoding: 不是具体的编码或者解码,他就是声明:此次打开文件使用什么编码本。一般来说:你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8(有些使用的是gbk)。

    f.read():你想操作文件,比如读文件,给文件写内容,等等,都必须通过文件句柄进行操作。

    close(): 关闭文件句柄(可以把文件句柄理解成一个空间,这个空间存在内存中,必须要主动关闭)。

2.路径注意

  • 路径中存在其它特殊符号,使得地址意义发生改变
    
     例: 'D:最新学习资料
    d.txt'
    
  • 解决方法

    • 在发生意义改变的符号前面加\来抑制转义
    • 或者路径整体前面添加r,r'D:最新学习资料 d.txt'
  • 相对路径

    • 从磁盘根目录开始
  • 绝对路径

    • 上一层文件夹用../

3.文件操作

r模式

  1. read() 一次全部读取出来,文件大会非常占内存

  2. read(n) n表示字符,☞读到什么位置

  3. readline()读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个

    • 解决方法:在读取出来的数据后面添加.strip()
  4. readlines() 返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩盘。

    f = open('log',encoding='utf-8')
    print(f.readlines())
    f.close()
    # 结果['666666
    ', 'fkja l;
    ', 'fdkslfaj
    ', 'dfsflj
    ', 'df;asdlf
    ', '
    ', ]
    
  5. for循环(最最常用的)

    • 文件句柄是一个迭代器,特点每次循环只在内存中占一行的数据,非常节省内存
    f = open('../path1/弟子规',mode='r',encoding='utf-8')
    for line in f:
        print(line)
    f.close()
    

rb模式

  1. 以二进制格式打开一个文件用于只读,主要是操作非文字文件:图片,音频,视频等,并且如果你要是带有b的模式操作文件,那么不用声明编码方式。
  2. read read(n) readline(),readlines() for循环这几种方法

4.写

  • w模式
    • 文件不存在,是先创建,然后写内容
    • 文件存在先清空原文件内容,再写入新内容
  • wb模式
    • 文件不存在,是先创建,然后写内容
    • 文件存在,先清空原文件内容,再写入新内容

5.追加

  • a

注意

#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】

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

文件操作的其它操作

  read(n)

  1. 文件打开方式为文本模式时,代表读取n个字符
    2. 文件打开方式为b模式时,代表读取n个字节

  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) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()
f.close()

  tell()

使用tell()可以帮我们获取当前光标在什么位置

最最常用文本打开操作

  • with open() as ...
    • 好处:
      • 自动关闭文件句柄
# 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('老男孩老男孩')

r+模式!!!

  1. 读写度模式

    ##xxoo 文本内容
    abcd
    qwer
    sdf
    sidh
    sdjf
    小明  666#执行完显示
    
    with open('xxoo','r+',encoding='gbk') as f:
        print('--第一次读取-->>',f.readline())
        f.write('
    小明  666')
        print("--->>>",f.readline())
        #--第一次读取-->> abcd
    	--->>> 
        
    #读的时候光标在初始位置0开始读,
    #写的时再末尾添加,此时光标在尾部
    #再次读,从光标尾部读
    
  2. 先写后读

    with open('xxoo','r+',encoding='gbk') as f:
        f.write('小明  666')
        print(f.read())
    结果:
    r
    sdf
    sidh
    sdjf
      ##  先做写操作,写的内容默认从初始位置0开始写,会覆盖掉原来的数据,写完后光标再写的后面
        #再读的时候从光标位置读
    

    a+模式

    无论是先读还是先写,光标都是再末尾。。。
    
原文地址:https://www.cnblogs.com/xiaobai686/p/12095491.html