9.文件处理

  • 引子
  • 文件处理

  • 什么是文件?为何要用文件?如何用文件?

  • 字符编码应用
  • bytes类型

  • 文件操作方法
  • 控制文件指针移动
  • 文件的修改

  • 文件处理

  • 1、什么是文件

    文件是操作系统提供给用户或者应用程序操作硬盘的一种机制

  • 2、为何要用文件

    读写文件--------->存取硬盘
    应用程序:open()

    操作系统:打开文件

    计算机硬件: 硬盘空间
  • 3、如何用文件

    打开文件:得到文件句柄并赋值给一个变量
    读/写:通过句柄对文件进行操作
    关闭文件
r"D:acd.txt"   # 绝对路径:从头开始的文件夹路径 代表路径分隔符,加r是取消的特殊意义
r"aa.txt"          # 相对路径:相对当前运行程序所在的文件夹路径

# 回车与换行的来龙去脉
http://www.cnblogs.com/linhaifeng/articles/8477592.html
    
    
# 打开文件,得到文件句柄并赋值给一个变量
f = open(r"aa.txt",mode="rt",)   # open是指定你要打开文件的路径
# f的值-》文件句柄,文件对象

# 通过句柄对文件进行操作
res = f.read()
print(res,type(res))

# 关闭文件
f.close()  # 回收操作系统的资源
print(f)
f.read()   # f.read只适用于比较小的文件


# with上下文管理(帮你关文件)
with open(r"aa.txt",mode="rt",) as f,  
        open(r"a.txt",mode="rt",) as f1:  # ,转义换行符,其实这是一行
    res = f.read()


with open(r"aa.txt",mode="rt",) as f:
    for line in f:     
        print(line)    # line末尾其实是有一个换行符的
        
        
with open(r"aa.txt",mode="rt",) as f:        
        res=line.strip('
').split(':')   # 去掉换行符
        print(res)

  • 字符编码应用

		
	英文字符--------------》内存:ASCII格式的二进制--------------》硬盘:ASCII格式的二进制
		
中文字符、英文字符--------------》内存:gbk格式的二进制----------------》硬盘:gbk格式的二进制

日文字符、英文字符--------------》内存:shif-jis格式的二进制-----------》硬盘:shif-jis格式的二进制

                     编码                                编码
        万国字符---------------》内存:unicode格式的二进制-----------》硬盘:utf-8格式的二进制
         
中文字符、英文字符---------------》内存:unicode格式的二进制-----------》硬盘:gbk格式的二进制

日文字符、英文字符---------------》内存:unicode格式的二进制-----------》硬盘:shift-jis格式的二进制
  • 如何保证不乱码:

    存乱了

    用utf-8编码存入硬盘

    读乱了

    将读的编码改成与存的编码一致

    运行python程序的三个步骤:python test.py

1、启动python解释器
2、解释器将test.py的内容从硬盘读入内存
3、解释器解释执行刚刚读入内存的代码,识别python语法,比如x = "上"
# coding:gbk  # 在python程序的第一行,必须是在第一行。此行代码就是告诉python解释器在运行 
#               程序的时候不要再使用默认的字符编码表,要使用gbk

  • bytes类型

# 细节:以后写python程序,字符串前面要加小u,涉及这个程序在python2的程序中也能运行,
#      python3不需要加,它的本质就是unicode

#             编码                     编码
# 字符-------------------->unicode------------->其他编码

#             解码                     解码
# 字符<--------------------unicode<-------------其他编码

x = "上"
# x.encode 编码
print(x)
res = x.encode("gbk")     
print(type(res))          # res是gbk格式的字符编码

# 强调:在python3里,只会将unicode格式的数字转成字符,其余编码格式的数字均不会转换成字符
# x.decode 解码
print(res)
print(res.decode("gbk"))   

  • 文件操作方法

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

    r:只读模式 (默认模式,文件必须存在,不存在则抛出异常)

    w:只写模式 (不可读;不存在则创建;存在则清空内容)

    a:只追加写模式 (不可读;不存在则创建;存在则只追加内容)

  • 制文件读写内容的模式:

    t:控制读写的内容都是字符串类型(默认的)

    特点:
    1、只适用于文本文件
    2、一定要指定encoding参数

    b:控制读写的内存都是bytes类型

    1、写入时也需要提供字节类型
    2、一定不要指定encoding参数*
# r: 如果文件不存在则报错,文件存在则将文件指针跳到整个文件的开头
f = open(r'a.txt',mode='rt',encoding='utf-8')
print(f.read())
f.close()

# w: 如果文件不存在则创建空文档,如果文件存在则清空,文件指针跳到文件开头
f = open(r'b.txt',mode='wt',encoding='utf-8')
f.write("你好啊1
")
f.write("你好啊2
")  # 打开了文件不关闭的情况下,新写入的内容永远跟在老内容之后
f.write("你好啊3
")

f.close()

# a: 如果文件不存在则创建空文档,如果文件存在则清空,文件指针跳到文件末尾
f = open(r'c.txt',mode='at',encoding='utf-8')
f.write("你好啊1
")
f.write("你好啊2
")  # 打开了文件不关闭的情况下,新写入的内容永远跟在老内容之后
f.write("你好啊3
")
f.close()

# 读写模式
"+"   # 表示可以同时读写某个文件
r+t   # 读写(可读,可写)
w+t   # 写读(可读,可写)
a+t   # 写读(可读,可写)


x     # 只写模式(不可读;不存在则创建,存在则报错)
x+    # 写读(可读,可写)


# 例如
f = open(r'c.txt',mode='r+t',encoding='utf-8')
# print(f.readable())
# print(f.writable())
# print(f.read())

f.write("h")
f.close()


# b模式:对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作
with open('c.txt',mode='rb') as f:
    res = f.read()
    # print(type(res))
    # print(res)
    print(res.decode('utf-8'))


with open('1.mp4',mode='rb') as f:
    print(f.read())
    for line in f:
        print(line)


with open('1.mp4',mode='rb') as src_f,open(r'D:111111.mp4',mode='wb') as dst_f:
    for line in src_f:
        dst_f.write(line)

with open('d.txt',mode='wb') as f:
    msg = "你好"
    f.write(msg.encode('utf-8'))
  • 操作文件方法:

# 掌握
f.read()       # 读取所有内容,光标移动到文件末尾
f.readline()   # 读取一行内容,光标移动到第二行首部
f.readlines()  # 读取每一行内容,存放于列表中

f.write('1111
222
')    # 针对文本模式的写,需要自己写换行符
f.write('1111
222
'.encode('utf-8'))  # 针对b模式的写,需要自己写换行符
f.writelines(['333
','444
'])   # 文件模式
f.writelines([bytes('333
',encoding='utf-8'),'444
'.encode('utf-8')]) # b模式

# 了解
f.readable()  # 文件是否可读
f.writable()  # 文件是否可读
f.closed      # 文件是否关闭
f.encoding    # 如果文件打开模式为b,则没有该属性
f.flush()     # 立刻将文件内容从内存刷到硬盘
f.name


# 文件操作的其它方法:

with open('a.txt',mode='rt',encoding='utf-8') as f:
    res = f.read()
    print(res)                # 读所有行的内容
    print('=========================')
    res = f.read()
    print(res)

    print(f.readline())   # 可以一次读一行

    res = f.readlines()   # 读每一行内容,存放于列表中
    print(res)  
    pass



with open('a.txt',mode='wt',encoding='utf-8') as f:
    f.write("1111
222
333
")     # 针对文本模式的写,需要自己写换行符

    lines = ['aaa
',"bbbb
","cccc
"]
    for line in lines:
        f.write(line)                # 针对b模式的写,需要自己写换行符

    f.writelines(lines)             # 跟f.write(line)看似一样,但底层原理不同
    f.writelines("hello")           # for循环写入的,hello写了五次


with open('a.txt',mode='wt',encoding='utf-8') as f:
    f.write("hello")
    f.flush()             # 催促硬盘输入,其实是降低效率
    print(f.closed)
    print(f.name)

print(f.closed)


  • 控制文件指针移动

  • 1、被动控制文件指针移动

    只有t模式下的read(n)的n代表的是字符个数,除此以外都是字节个数

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


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

with open('a.txt',mode='at',encoding='utf-8') as f:
    f.truncate(6)


  • 2、主动控制指针移动

    f.seek(移动的字节个数,模式)

    模式有三种:

    0:永远参照文件开头

    1:参照当前所在的位置

    2:永远参照文件末尾

注意:只有0模式可以在t下使用,1和2只能在b模式下使用
with open('a.txt',mode='rt',encoding='utf-8') as f:
    f.seek(3,0)
    f.seek(5,0)
    print(f.tell())

with open('a.txt',mode='rb') as f:
    f.seek(3,1)
    f.seek(5,1)
    print(f.tell())
    res=f.read()
    print(res.decode('utf-8'))

with open('a.txt',mode='rb') as f:
    f.seek(-3,2)
    print(f.tell())
    f.seek(0,2)

  • 文件的修改

  • 修改文件的方式一:

    1、先将文件内容全部读入内存

    2、在内存中完成修改

    3、将修改后的内容覆盖回原文件

ps: 耗费内存不耗费硬盘
with open('e.txt', mode="rt", encoding='utf-8') as f:
    data = f.read()

    
with open('e.txt',mode='wt',encoding='utf-8') as f1:
    f1.write(data.replace('egon','EGON'))

  • 修改文件的方式二:

    1、以读的方式打开原文件,然后以写的方式打开一个临时文件

    2、读原文件的一行内容到内存,然后在内存中修改完毕后再写入临时文件,循环往复直到全部改完

    3、删出原文件,将临时文件重命名为原文件名

ps: 耗费硬盘不耗费内存
import os

with open('e.txt',mode='rt',encoding='utf-8') as src_f,open('.e.txt.swp',mode='wt',encoding='utf-8') as dst_f:
    for line in src_f:
        dst_f.write(line.replace('EGON','egon'))

os.remove('e.txt')
os.rename('.e.txt.swp','e.txt')
原文地址:https://www.cnblogs.com/gfeng/p/14190981.html