文件操作

文件是操作系统给用户/应用程序的一种虚拟单位,文件直接映射的是硬盘空间。
应用程序  >>>(发送指令)>>>   操作系统  >>>(操控硬件)>>>  硬盘数据

 ps:文件路径:

      绝对路径:从磁盘开始找到文本文件的位置

      相对路径:文本文件与执行文件所在同一文件夹

一.操控文件:

  普通方法:

  f = open()  # 向操作系统发送请求,发开文件
  f.read()  # 对文件进行的操作
  f.close()  # 关闭文件,打开的文件会占据应用程序和操作系统内存空间,所以操作完文件后要关闭文件

 

  推荐方法:

    with open(r'文件地址',mode='打开方法',encoding=' ') as f(f是变量名):
    print(f) # f是文件对象(句柄)
    f.read # 想操作系统发送请求,对问价进行操作
    print(f.read) # 若文件是可读类型,打印出整个文件的内容
    
    代码块1
    代码块1
    ...    # 当代码快执行完后,自动关闭文件,优化内存,无序手动关闭

 

二.处理文件的的模式:

  文件的打开方式

  r 只读模式:当文件存在,读出文件内容,当文件不存在,报错。
  w 只写模式:当文件存在,清空文件,光标移动到文件开头,当文件不存在则创建文件。
  a 追加写模式:当文件存在,光标移动到文件末尾,文件不存在创建文件
  r+ 可读可写,当文件存在,可读写文件,文件不存在则报错
  w+ 可写可读,当文件存在,清空文件,文件不存在创建文件
  a+ 可写可读,当文件存在,光标移动到文件末尾,不存在则创建

  文件的打开格式

  t 文本文件:

      1.文件内容都是以字符串为单位的

      2.只能针对文本

      3.必须指定encoding参数

    b 二进制模式:

      1.读写文件都是以Bytes/二进制为单位的
      2.针对所有对象
      3.一定不能指定ending参数

 

三.内置方法:

r 模式下的文件处理方法
with open(r'r_file.txt',mode='rt',encoding='utf-8') as f:
    print(f)  # 文件对象,也叫句柄
    print(f.readable())  # 文件是否可读 Ture
    print(f.writable())  # 文件是否可写 False
    print(f.read())  # 读取整个文件内容 光标停留在最后的位置
    print(f.readline())  # 一行一行读取文件的内容 包括(\r\n)
    print(f.readline())
    print(f.readlines())  # 读出全部内容,返回的是一个别表,每一行是内容是字符串包括\r\n
   #readlines 的内部原理是for循环文件,取出的内容添加到列表里
    r_list = []
    for line in f:  # 文件可以别for循环
        r_list.append(line)
    print(r_list)

w 模式下的文件处理方法: 慎用!!!
with open(r'D:\OldBoy-py\文件\w_flie.txt',mode='wt',encoding='utf-8') as f:
    print(f)  # 文件对象,也叫句柄
    print(f.readable())  # 文件是否可读 False
    print(f.writable())  # 文件是否可写 True
    f.write('wong\n')  #  清空整个文件,写入‘wong’
    f.write('wong\t')  #  清空整个文件,写入‘wong’
    f.write('wong')  #  清空整个文件,写入‘wong’
    w_list = ['wong\t','waller\n','age','20']
    f.writelines(w_list) # 将列表的内容写到文件,列表里的数据为字符串类型
    for line in w_list:
        f.write(line)
a 模式下的文件处理方法:
with open(r'a_flie.txt',mode='at',encoding='utf-8') as f:
    print(f)  # 文件对象,也叫句柄
    print(f.readable())  # 文件是否可读 False
    print(f.writable())  # 文件是否可写 True
    f.write('\nwong\r')
    f.write('waller')
    a_list = ['wong\t', 'waller\n', 'age', '20']
    f.writelines(a_list)

read() 括号内的数:

#文件seek.txt
#内容: 
      用户名waller
123是密码 #在‘rt’模式下,read括号内的数表示的是字符的个数,除此之外均表示字节数 with open(r'seek.txt',mode='rt',encoding='utf-8') as f: res = f.read(3) print(res) # >>> 用户名 #在‘rb’模式下,read括号内的数表示的是字节数 with open(r'seek.txt','rb') as f: res = f.read(10) # 读的是10个字节 Bytes print(res) # >>> b'\xe7\x94\xa8\xe6\x88\xb7\xe5\x90\x8dw' res_str = res.decode('utf-8') # 将二进制解码成字符串形式 # res_str = str(res,encoding='utf-8') # 将二进制解码成字符串形式 print(res_str) # >>> 用户名w

文件内光标移动seek

# f.seek(offset,whence)
#offset:光标的相对偏移量,移动的位数 ,只能是字节数
#whence:
#       0 参照文件的开头,t b 模式均可以使用
#       1 参照光标当前的位置,b 模式可以使用
#       2 参照文件的末尾,b 模式可以使用

with open(r'seek.txt','rt',encoding='utf-8') as f:
    print(f.read(1))  # >>> 用
    f.seek(6,0)  # 光标从文件开头移动6个字节的位置
    print(f.read(1))  # >>> 户 从第6个字节的位置向后读取一个字符

with open(r'seek.txt','rb') as f:
    res = f.read(3)
    # rb模式下读的是二进制的字节数,注意如果有汉字要把一个汉字完整的字节数都读出来,否则报错
    print(res)  # >>> b'\xe7\x94\xa8'
    print(str(res,encoding='utf-8'))  # >>> 用
    f.seek(9,0)
    print(f.read(3))  # >>> b'wal'


with open(r'seek.txt','rt',encoding='utf-8') as f:
    print(f.read(1))  # >>> 用
    f.seek(0,1)  # 参照当前光标的位置移动0个位置
    print(f.read(1))  # >>> 户

with open(r'seek.txt','rb') as f:
    print(f.read(3))  # >>> b'\xe7\x94\xa8'
    print(f.read(3).decode('utf-8'))  # >>> 户
    f.seek(3,1)  # 参照光标当前的位置把光标移动3个字节
    print(f.read(3))  # >>> b'wal'
    print(str(f.read(3),encoding='utf-8'))  # >>> ler

with open(r'seek.txt','rb') as f:
    f.seek(-6,2)  # 光标参照末尾向前移动个字节
    ser = f.read(6)
    print(ser)  # >>> b'\xe5\xaf\x86\xe7\xa0\x81'
    print(ser.decode('utf-8'))  # >>> 密码

四.应用

文件内容监测:

with open(r'文件内容检测.txt','rb')as f:
    f.seek(0,2)  # 把光标移动到文件末尾,只能b模式
    while True:  # 循环判断
        res = f.readline()  # 打印新增的一行内容
        if res:  # 判断是否新增了内容
            print(res.decode('utf-8'))  # 如果新增了则打印出新增的内容

截断文件内容

with open(r'文件截断.txt','a',encoding='utf-8') as f:  # 也可以用 r+
    f.truncate(3)  # >>> 用
    # 截取文件3个字节的内容,将文件内推清空,并把截取的内容添加到该文件内

文件修改

'''
方法一:
1.将文件由硬盘读到内存
2.在内存中操作文件,此时不影响硬盘里的文件
3.改写覆盖原文件

'''
with open(r'文件修改.txt','rt',encoding='utf-8') as f:  # 由硬盘读到内存
    res = f.read()  # 拿到文件的内容,赋值给一个变量
    print(res)
with open(r'文件修改.txt','w',encoding='utf-8') as f:
    data = res.replace('waller','wong')  # 修改替换文件的内容
    print(data)
    f.write(data)

优点:
任意时间硬盘上只有一个文件 不会占用过多硬盘空间
缺点:当文件过大的情况下,可能会造成内存溢出
'''
方法二:
1.创建一个新文件
2.把原文件的内容一行一行读出来并修改
3.将修改的内容一行一行添加到新文件里
4.新文件的名字修改成和源文件一样的名字,并删除原文件

'''
import  os  # 调用模块
with open(r'文件修改.txt','rt',encoding='utf-8')as f,\
        open(r'新文件修改.txt','at',encoding='utf-8') as j:
    for line in f:
        res = line.replace('waller', 'wong')
        j.write(res)
os.remove('文件修改.txt')
os.rename('新文件修改.txt','文件修改.txt')

优点:内存中始终只有一行内容 不占内存
缺点:再某一时刻硬盘上会同时存在两个文件

 

posted @ 2019-07-05 20:07  waller  阅读(168)  评论(0编辑  收藏  举报