ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

07-文件处理

2022-06-10 09:31:38  阅读:102  来源: 互联网

标签:文件 utf 07 encoding 处理 模式 read txt


1.文件介绍

# 1.什么是文件
    文件是操作系统提供给用户/应用程序操作硬盘数据的一种虚拟的概念/接口。	

# 2.为何要用文件
    用户/应用程序可以通过文件将数据永久保存到硬盘中。
   (用户直接操作的是文件,对文件进行的所有操作,都是在给操作系统发送系统调用,再操作系统转换成具体的硬盘操作。)
    
# 3.如何用文件:open()

# 控制文件读写内容的模式:(按什么格式,文本,还是二进制)
    大前提: tb模式均不能单独使用,必须与r/w/a之一结合使用

    t(默认的):文本模式
        1. 读写文件都是以字符串str(在内存中其实就是Unicode)为单位的
        2. 只能针对文本文件
        3. 必须指定encoding参数('utf-8')

    b:二进制模式:
        1.读写文件都是以bytes/二进制为单位的
        2. 可以针对所有文件
        3. 一定不能指定encoding参数	

# 控制文件读写操作的模式:(按什么方式,只读、只写,还是读写)
    r:只读    【不可写,不存在则报错】                      -默认的-
    w:只写    【不可读,不存在则创建,存在则全删,指针位于开头】
    a:只追加写 【不可读,不存在则创建,存在则指针位于最后】
    x,只写    【不可读;不存在则创建,存在则报错】            -了解-

    +:r+、w+、a+连用,表明各自相应的可读可写模式		

2.基本操作流程与资源回收

# 解决字符串 \ 转义问题:
    字符串前加r ,表示原生字符串,不转义。
    eg: r'c:\a\b\c\d.txt'

# 基本操作流程:
    打开文件、读写文件、关闭文件

# 打开文件
    f = open(r'a.txt', mode='rt', encoding='utf-8')  # 默认是mode= 'rt' 文本读取

# 操作文件
    # 读/写,对文件进行的操作,都是在给操作系统发送系统调用,再操作系统转换成具体的硬盘操作
    res = f.read()
    print(res)

# 关闭文件 
    # 回收资源:1.回收操作系统资源,需要关闭文件;2.解除内存中变量赋值的占用

    f.close()  # 回收操作系统资源,需要关闭文件
    del f  # 回收应用程序资源 (通常不需要做,python内部自动会垃圾回收)

3. with上下文管理

with open('a.txt', mode='r',encoding='utf-8') as f:
    res = f.read()
    print(res)

# with 可以打开多个对象
with open('a.txt', mode='r', encoding='utf-8') as f1, open('b.txt', 'r', encoding='utf-8')as f2:
    res1 = f1.read()
    res2 = f2.read()
    print(res1)
    print(res2)

4.详细介绍文件模式

4.1控制文件读写操作的模式

# 以t 文本格式为基础,进行操作模式详解-----》按照什么方式去操作:只读、只写、读写


# 1.r(默认):只读模式,就不能调用f.write()等写方法

    # 当文件不存在时,报错;

    # 当文件存在时,文件指针会在文件开头位置
    with open('a.txt', mode='rt', encoding='utf-8') as f:
        print('第一次读,指针在文件开头位置'.center(40, '*'))
        res1 = f.read()  # 经过f.read()后,指针已经在文件的最后位置了。
        print(res1)

        print('第二次读,指针在文件最后位置'.center(40, '*'))
        res2 = f.read()  # 无内容
        print(res2)

        
# 2.w:只写模式,就不能调用f.read()等读方法

    # 当文件不存在时,会创建新的空文件
    with open('c.txt', mode='wt', encoding='utf-8') as f:
        f.write('只读模式测试第一行\n')  # 换行等需自己手动写 '\n'
        f.write('只读模式测试第二行\n')  
	
    # 当文件存在时,会清空文件,指针位于开始位置(不是覆盖,是全删掉)

    
# 3.a:追加写模式,就不能调用f.read()等读方法

    # 文件不存在时,会创建空文档

    # 文件存在时,文件指针位于最后位置
    with open('c.txt', mode='at', encoding='utf-8') as f:
        f.write('只读模式测试第三行\n')  # 换行等需自己手动写 '\n'
        f.write('只读模式测试第四行\n')  
    

# 总结:
w 与 r 的区别:w常用于新建文件写入,r常用于旧文件读取
+ 模式:与 r、w、a 连用,表明可读可写,会有各自的特性(r:文件不存在时,就报错) 
    ---不常用,基本都是只读只写

4.2控制文件读写内容的模式

大前提: tb模式均不能单独使用,必须与r/w/a之一结合使用
    
# t(默认的):文本模式
    1. 读写文件都是以字符串str(在内存中其实就是Unicode)为单位的
    2. 只能针对文本文件
    3. 必须指定encoding参数('utf-8')
    
# b:binary模式: (实际就是二进制)
    1.读写文件都是以bytes/二进制为单位的
    2. 可以针对所有文件
    3. 一定不能指定encoding参数

# 总结:b模式更通用,t模式只能针对文本

4.3 循环读取文件

#  1.while 以一次读取多少字节的形式
with open(r'1.gif', mode='rb') as f:
    while True:
        res = f.read(1024)
        if len(res) == 0:
            break
        print(len(res))

        
#  2.for 以换行 为循环
with open(r'1.gif', mode='rb') as f:
    for line in f:
        res = f.read(1024)
    	print(res)

5.文件的操作其他方法

# 读操作
f.read()  # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾
f.readline()  # 读取一行内容,光标移动到第二行首部
f.readlines()  # 读取每一行内容,存放于列表中

# 强调:
f.read()与f.readlines()都是将内容一次性读入内容,
如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入,
有两种实现方式:以读取字节 或 以读取行 为while 和for循环读取的方式


# 写操作
f.write('1111\n222\n')  # 针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8'))  # 针对b模式的写,需要自己写换行符

f.writelines(['333\n', '444\n'])  # 文件模式 将列表的每个元素写入
# 等同于以下
l = ['333\n', '444\n']
for line in l:
    f.write(line)

f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')])  # b模式

# 了解
f.readable()   # 文件是否可读
f.writable()   # 文件是否可读
f.closed       # 文件是否关闭
f.encoding     # 如果文件打开模式为b,则没有该属性
f.flush()      # 立刻将文件内容从内存刷到硬盘  -正常情况下:不执行,会大大增加IO输入
f.name

6.文件的高级操作:控制文件指针的移动

# 大前提:
  文件内指针的移动都是Bytes/字节为单位的,
  唯一例外的是t模式下的read(n), n以字符为单位,代表字符个数

with open('a.txt', mode='rt', encoding='utf-8') as f:
    data = f.read(3)  # 读取3个字符

with open('a.txt', mode='rb') as f:
    data = f.read(3)  # 读取3个Bytes

# 之前文件内指针的移动都是由读/写操作而被动触发的,
  若想读取文件某一特定位置的数据,则需要用f.seek方法主动控制文件内指针的移动。


# f.seek(指针移动的字节数,模式控制): 

# 模式控制:
    0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
    1: 该模式代表指针移动的字节数是以当前所在的位置为参照的
    2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的
    # 强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

    # 模式0: 参照物是文件开头位置
        f.seek(9, 0)  # 9
        f.seek(3, 0)  # 3  

    # 模式1: 参照物是当前指针所在位置
        f.seek(9, 1)  # 9
        f.seek(3, 1)  # 12

    # 模式2: 参照物是文件末尾位置,应该倒着移动
        # 假设末尾为12
        f.seek(-9, 2)  # 3
        f.seek(-3, 2)  # 9

# f.tell()  获取文件指针当前位置

7.文件修改的两种方式

# 对于硬盘上的数据,没有修改/插入一说,都是新的数据覆盖旧的数据。


# 方式一:文本编辑器采用的方式
with open('b.txt', mode='r', encoding='utf-8') as f:
    res = f.read()
    data = res.replace('dsb', 'Alex')

with open('b.txt', 'w', encoding='utf-8') as f:
    f.write(data)


# 方式二:编程程序常用
import os

with open('b.txt', 'r', encoding='utf-8') as f1,\
    open('.b.txt.swap', 'w', encoding='utf-8') as f2:
    for line in f1:
        f2.write(line.replace('Alex', 'dsb'))

os.remove('b.txt')
os.rename('.b.txt.swap', 'b.txt')


# 总结:
1.方式一:节省了硬盘空间(只有一份文件),但浪费了内存空间(一次性读入到内存)
2.方式二:浪费了硬盘空间(同时存在两份文件),但节约了内存空间(一次性只读入了一行数据到内存)

标签:文件,utf,07,encoding,处理,模式,read,txt
来源: https://www.cnblogs.com/Edmondhui/p/16362008.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有