文件操作

时间:2019-11-19
本文章向大家介绍文件操作,主要包括文件操作使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

* 打开文件的模式

模式选择

文件的上下文管理
       with open(....)as f:

   文件读写模式(常用r、w模式)rwa:称纯净模式
      r   只读模式
      1.文件不存在,报错
      2.文件存在,光标在文件开头(什么都没开始读)
     w  只写模式
      1.文件不存在 自动创建新文件
      2.文件存在  先清空文件内容在执行写入
     a   只追加模式(只能在文件的末尾添加内容)
      1.文件不存在,自动创建新文件
      2.文件存在,光标直接在文件末尾
   文件操作单位
     t   文本模式(只读文本的文件)
      只能和r\w\a连用  ,并且不写的情况,默认是t
     b   原生的二进制
      1.只能和r\w\a连用
      2.该模式通常用来处理非文本文件
      3.直接存储网络上传输过来的二进制数据

r 只读
r+  读写,不创建
w 新建只写
w+ 新建读写
区别:
r+与w+ :r+读写,若文件不存在,报错
        w+可读可写,若文件不存在,创建



# r+ 读写模式
# with open(r'test', mode='r+', encoding='utf-8')as f:  # 后面参数不写,默认rt模式
#     print(f.readable())  # 可读
#     print(f.writable())  # 可写
#
#     # print(f.readline())  # 读一行
#     print(f.read())  # 读全部
#     # f.write('hahhas')   # 末尾添加

# r+b  读写,并转换成二进制模式
with open(r'test', mode='r+b')as f:  # 后面参数不写,默认rt模式
    print(f.readable())  # 可读
    print(f.writable())  # 可写
    # print(f.read())

    res = f.read()
    # print(res)
    # 1.二进制转换utf-8
    # print(res.decode('utf-8'))
    # 2.解码
    res1 = str(res, encoding='utf-8')
    print(res1)

一、修改文件的两种方法

第一种方式修改文件:

修改文件:

1.将数据由硬盘读到内存(读文件)

2.在内存中完成修改(字符串的替换)

3.再覆盖原来的内容(写文件)

优点:硬盘上只有一个文件
缺点:当文件过大的情况下,可能会造成内存溢出

replace 替换

with open(r'test02', 'r', encoding='utf-8') as f:    
    res = f.read()    
    print(res)with open(r'test02', 'w', encoding='utf-8')as f:    
        data = res.replace('jeff', 'gyy')   # 替换    
        print(data)    
        f.write(data)

第二种方式修改文件:

import os

1.创建一个新文件
2.读取老文件内容到内存进行修改 将修改好的内容写到新文件当中
3.将老文件删除 将新文件的名字改成老文件
优点:内存中始终只有一行内容,不占内存
缺点:在某一时刻硬盘上会同时存在两个文件

with open(r'test02', 'r', encoding='utf-8') as read_f,\
        open(r'test02.swap', 'a', encoding='utf-8') as write_f:
    for line in read_f:
        new_line = line.replace('gyy', 'cjm')
        write_f.write(new_line)
os.remove(r'test02')  # 删除老文件
os.rename(r'test02.swap', 'test02')   # 新文件改名为老文件名字

二、字符编码

encode 编码
decode 解码
乱码原则:用什么编码就用什么解码

a = "嘉"
# 第一种编码,解码
res = a.encode('utf-8')  # 编码
print(res.decode('utf-8'))  # 解码

# 第二种编码,解码
res1 = bytes(a, encoding='utf-8')  # 编码二进制
print(res1, type(res1))  # 显示编码结果
# print(res1.decode('utf-8'))  # 解码,并显示

res2 = str(res1, encoding='utf-8')  # 解码二进制
print(res2, type(res2))

三、进制转换

# 其他进制转10进制
dd = int('1100', 2)
print(dd)


# 10进制转2进制
aa = bin(666)
print(aa)
# 10进制转8进制
bb = oct(666)
print(bb)
# 10进制转16进制
cc = hex(666)
print(cc)

四、文件内光标移动

一: read(3):

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

二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate

注意:

  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
f.seek(offset,whence)
offset  相对偏移量,光标移动的位数
whence:
    0:参照文件的开头
    1:参照光标所在当前位置   只能在b模式下使用
    2:参照文件的末尾     只能在b模式下使用
  1. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
import time
with open('test.txt','rb') as f:
    f.seek(0,2)  # 光标移动
    while True:
        line=f.readline()
        if line:
            print(line.decode('utf-8'))
        else:
            time.sleep(0.2)

五、截断文件

truncate() 方法用于截断文件并返回截断的字节长度。

指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。

fileObject.truncate([size])

原文地址:https://www.cnblogs.com/WQ577098649/p/11887407.html