文件处理及处理模式

文件处理 

1.文件的基本介绍

什么是文件? 操作系统提供给用户操作复杂硬件(硬盘)的简易的接口

为什么要操作文件? 人或者应用程序需要永久的保存数据

如何使用?

f = open()     #表示打开文本
f.read()      #表示读取文本内的所有内容
f.close()    #表示关闭文件

都是通过python代码来操作文件

f = open(r' 文件地址,ending = 'utf-8')    #向操作系统发送请求 打开某个文件,    r 表示取消转义
# 应用程序要想操作计算机硬件 必须通过操作系统来简单的操作
print(f)    # f是文件对象
print(f.read())  #windows操作系统默认的编码是gbk
f.read()  #向操作系统发送请求 读取文件内容
f.close()  # 告诉操作系统 关闭打开的文件
print(f)
print(f.read())

2.文件上下文操作 (可同时打开多个文本文件)

with open(r'文件位置','r',ending = 'utf-8') as f   #f仅仅是一个变量名,可以把它看成是一个遥控器。

(1)操作文件单位的方式

  文本文件 t在使用的时候需要指定encoding参数, 如果不指定,就默认是操作系统的默认编码

rb指二进制模式,在含‘b’的模式中,不需要指定encoding参数。

文件打开的模式有三种:①r 只读模式;② w 只写模式;③ a 追加写模式

(2)操作文件单位的方式:

  1)t 文本文件。t在使用的时候需要指定encoding参数,如果不知道默认是操作系统的默认编码。

  2)b 二进制 。一定不能指定encoding参数,mode参数可以不写,不写的话默认是rt只读的文本文件,这个t不写默认就是t。

with open(r' 文本位置地址',mode='r',encoding='utf-8') as f:
print (f.readable( )) #是否可读
print (f.writable( ))    #是否可写
print (f.read( ))    #一次性将文件的内容全部读出

  3)r 模式在打开文件的时候,如果文件不存在,直接报错。’

  文件路径可以写相对路径,但是需要注意该文件必须与执行文件在同一层文件下

with open(r'文件位置地址,encoding='utf-8') as f: 其中mode关键字可以不写
print(f.readable())
print(f.writable())
print(">>>1:")
print(f.read()) # 一次性将文件内容全部读出
print('>>>2:')
print(f.read()) #读完一次之后,文件的光标已经在文件末尾了,再读就没有内容可读了
print(f.readlines())#返回的是一个列表,列表中的一个个元素对应的就是文件的一行行内容
for line in f:# f 可以被for循环for每循坏一次就读一行内容
print(i)#这个方法可以解决大文件一次性读取占用内存过高的问题
print(f.readline()) #只读取文件的一行内容

  4)w模式:w模式一定要慎用

  • 文件不存在的情况下,自动创建该文件。
  • 当文件存在的情况下 会先清空文件内容再写入
with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写

  5)a模式   追加模式(将内容追加到尾部)

  • 当文件不存在的情况下 自动创建该文件
  • 当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后
with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
f.write('我是小尾巴
')

 3.打开文本的模式有以下几种

(1).打开文件的模式有(默认为文本模式):

  r ,只读模式【默认模式,文件必须要存在,如果不存在会出现报警】

  w,只写模式【不可读;不存在则会创建;存在则清空内容】

  a,之追加写模式【不可读;不存在则创建;存在则只追加内容】

(2).对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作

  rb、wb、ab

注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

(3)."+" 表示可以同时读写某个文件

  r+, 读写【可读,可写】

  w+,写读【可读,可写】

  a+,写读【可读,可写】

  补充:在 rt 模式下,read内的数字表示的是字符的个数,除此之外,数字表示的都是字节

with open(r'test','r',encoding='utf-8') as f:
print(f.read(5))

(4).文件内光标的移动

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

(5).截断文件

with open(r'文本位置',‘a’,encoding=utf-8')as f:
  f.truncate(6)  # 接收的字节的长度(整型),
  # 保留0~6字节数 后面的全部删除(截断)

4.文件的修改

# 文件a.txt内容如下
张一蛋      山东    179    49    12344234523
李二蛋      河北    163    57    13913453521
王全蛋      山西    153    62    18651433422

# 执行操作
with open('a.txt',mode='r+t',encoding='utf-8') as f:
    f.seek(9)
    f.write('<主任>')
    
# 文件修改后的内容如下
张一蛋   <主任> 179    49    12344234523
李二蛋     河北    163    57    13913453521
王全蛋     山西    153    62    18651433422

# 强调:
# 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容
# 2、内存中的数据是可以修改的

(1)文件修改文件一

  先将数据由硬盘读到内存(读文件),在内存中完成修改(字符串的替换),再覆盖原来的内容(写文件)

with open(r'test02.txt','r',encoding='utf-8') as f:
    data = f.read()    #只读模式
    print(data)
    print(type(data))   #查看data的数据类型

with open(r'test02.txt','w',encoding='utf-8') as f:
    res = data.replace('egon','jason')      #repalce(旧值,新值)
    print(data)
    f.write(res)    

# 优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
# 缺点:当文件过大的情况下,可能会造成内存溢出

(2)文件修改方式二

  创建一个新文件;循环读取老文件内容到内存进行修改 将修改好的内容写到新文件中;将老文件删除 将新文件的名字改成老文件名。

import os
with open(r'旧的文本位置','r',encoding='utf-8') as read_f,
        open(r'新建的文本位置','a',encoding='utf-8') as write_f:
    for line in read_f:
        new_line = line.replace('jason','egon')
        write_f.write(new_line)
os.remove('旧的文本位置t')
os.rename('新的文本位置','旧的文本位置’)
# 通过新建一个文本文件来取代旧的文本文件

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

 

  

原文地址:https://www.cnblogs.com/blue-tea/p/11141099.html