liangxiaoying

今日内容

文件操作

一、介绍
    计算机系统分为:计算机硬件,操作系统,应用程序
    
    我们要用python或其他语言编写的应用程序若想要永久保存下来,必须保存与硬盘中,这就涉及到应用程序要操作硬件。
    应用程序是无法直接操作硬件的,这就用到了操作系统。
    操作系统吧复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
    
    有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
    #1.打开文件,得到文件句柄并复制给一个变量
    f=open(\'a.txt\',\'r\',\'encoding=utf-8\')  #默认打开模式就为r
    
    # f=open(\'a.txt\',\'r\')的过程分析
    # 由应用程序向操作系统发起系统调用open(...)
    # 操作系统打开该文件,并返回一个句柄给应用程序
    # 操作程序将文件句柄赋值给变量f
    
    #2.通过句柄对文件进行操作
    data=f.read()
    #3.关闭文件
    f.close()
    
二、强调
    打开一个文件包含两部分资源,操作系统打开的文件+应用程序的变量。
    在操作完毕一个文件是,必须把该文件的这两部分资源不落地回收,
    回收方法为:
        1、f.close()  #回收操作系统打开的文件
        2、del f  #回收应用程序级的变量
        
    其中del f 一定要发生在f.close()之后,否则救护导致操作系统打开的文件还没有关闭,白白占用资源,而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,早操作完毕文件后,一定要记住f.close()
    
    f=open(...)室友操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认方式编码和明显是操作系统和说了算,操作系统会用自己的默认编码去打开文件,在Windows下是gbk,在Linux下是utf-8.
    f=open(\'a.txt\',\'r\',\'encoding=utf-8   \') 
    

文件处理

1、什么是文件
    文件是操作系统提供给用户或者说应用程序操作硬盘的一种功能

2、为何要用文件
    读写文件就是在读写硬盘:我们对文件的读写操作都会被操作系统转换成硬盘的读写操作

    应用程序-------------》文件对象、文件句柄
    操作系统-------------》文件
    硬件-----------------》硬盘
    
 3、如何用文件

# f = open(r\'a.txt\', mode=\'rt\', encoding=\'utf-8\')  #默认打开模式就为r
# # print(f)  # 文件对象、文件句柄
# res = f.read()
# print(res)
# 
# f.close()
# # print(f)
# # f.read()
# # del f
# 
# 
# with open(r\'a.txt\', mode=\'rt\', encoding=\'utf-8\') as f,\
#         open(\'b.txt\',mode=\'wt\',encoding=\'utf-8\') as f1:
#     pass
   

文件的打开模式

文件句柄 = open(\'文件路径\',\'模式\')

 文件打开模式
 1、控制文件读写操作的模式
     r:只读模式(默认模式,文件必须存在,不存在则抛出异常)
     w:只写模式(不可读,不存在则创建;存在则清空内容)
     a:只追加写模式(不可读;不存在则创建;存在则只追加内容)
 
2、控制文件读写内容的模式
     t(默认的):读写都是以字符串为单位的,只适用于文件文件,必须指定encoding参数
     b:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数

# r模式:只读模式,如果文件不存在则报错,文件存在则文件指针处于文件开头
# f = open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\')
# # print(f.read())
# # print(\'=\'*50)
# # print(f.read())
# print(f.readable())
# print(f.writable())
# f.close()

# w模式:只写模式,如果文件不存在则创建空文档,文件存在则清空,文件指针处于文件开头
# f = open(\'a.txt\',mode=\'wt\',encoding=\'utf-8\')
# # f.write("你好\n")
# # f.write("哈哈哈\n")
# # f.write("我擦勒\n")
#
# f.write("你好\n哈哈哈\n我擦勒\n")
# # print(f.readable())
# # print(f.writable())
#
# f.close()
# 总结:w模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面

# a模式:只追加写模式,如果文件不存在则创建空文档,文件存在不会清空,文件指针处于文件末尾
# f = open(\'c.txt\',mode=\'at\',encoding=\'utf-8\')
# # f.write("4444\n")
# # f.write("555\n")
# # f.write("6666\n")
# print(f.readable())
# print(f.writable())
# f.close()

# 总结:a模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面,这一点与w模式相同
#    不同的是,在打开了文件关闭然后重新打开的情况下,a模式永远写在后面


# b模式:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数
# with open(\'1.mp4\',mode=\'rb\') as f:
#     res = f.read()
#     print(res.decode(\'utf-8\'))


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


# with open(\'a.txt\',mode=\'ab\') as f:
#     f.write("啊手动阀手动阀".encode(\'utf-8\'))


# 例:文件拷贝功能
# # 方案一:
# with open(\'1.mp4\',mode=\'rb\') as f1,open(r\'D:\1111111.mp4\',mode=\'wb\') as f2:
#     res = f1.read()
#     f2.write(res)


# 方案二:
# 储备知识:
# with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
#     # f.read()
#     for line in f:
#         print(line,end=\'\')


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

# 具体实现:
# with open(\'1.mp4\',mode=\'rb\') as f1,open(r\'D:\1111111.mp4\',mode=\'wb\') as f2:
#     for line in f1:
#         f2.write(line)


# 可读可写
# r+t
# w+t
# a+t
#
# r+b
# w+b
# a+b

# with open(\'a.txt\',mode=\'r+t\',encoding=\'utf-8\') as f:
#     print(f.readable())
#     print(f.writable())
#     print(f.read())
#     f.write("22222222222222222222\n")


# with open(\'a.txt\',mode=\'w+t\',encoding=\'utf-8\') as f:
#     print(f.readable())
#     print(f.writable())

文件操作的其他方法

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

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

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



# with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
#     # lines = f.readlines()
#     # print(lines)
#
#     print(f.readline())
#     print(f.readline())


# with open(\'a.txt\',mode=\'wt\',encoding=\'utf-8\') as f:
#     # f.write("111\n222\n333\n")
#
#     # lines = [\'111\n\',\'222\n\',\'3333\n\']
#     # for line in lines:
#     #     f.write(line)
#
#     # f.writelines(lines)
#
#     f.write(\'hello\')
#     f.flush()
#     # f.writelines(\'hello\')
#

控制文件按指针移动

一、read(3)
    1.文件打开方式为文本模式是,代表读取3个字符
    2.文件打开方式为b模式时,代表读取3个字符
二、其余的文件内光标移动都是以字节为单位,如seek,tell,truncate
    注意:
    1.seek有3种移动方式0,1,2,其中1和2必须在b模式下进行,但无论那种模式,都是以bytes为单位移动的
    2.truncate是截断文件,所以文件的打开方式必须可写,但不能用w或者w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a+等模式下测试效果
    
# 大前提:只有t模式下的,f.read(n)中的n代表的是字符个数,除此以外,关于指针的移动,单位都是字节bytes
# # f.read()
# # 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(6)
# #     res = f.read(8)
# #     print(res.decode(\'utf-8\'))
#
# # f.truncate()
# # with open(\'a.txt\',mode=\'r+t\',encoding=\'utf-8\') as f:
# #     f.truncate(8)
#
#
# # f.seek移动的全都是字节个数
# # f.seek(字节个数,0)
# # f.seek(字节个数,1)
# # f.seek(字节个数,2)

文件的修改(补充小知识)

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim...)
# import os
# 
# with open(\'a.txt\') as read_f,open(\'.a.txt.swap\',\'w\') as write_f:
#     data=read_f.read() #全部读入内存,如果文件很大,会很卡
#     data=data.replace(\'alex\',\'SB\') #在内存中完成修改
# 
#     write_f.write(data) #一次性写入新文件
# 
# os.remove(\'a.txt\')
# os.rename(\'.a.txt.swap\',\'a.txt\')

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os
    
with open(\'a.txt\') as read_f,open(\'.a.txt.swap\',\'w\') as write_f:
    for line in read_f:
        line=line.replace(\'alex\',\'SB\')
        write_f.write(line)
os.remove(\'a.txt\')
os.remove(\'.a.txt.swap\',\'a,txt\')

分类:

技术点:

相关文章:

猜你喜欢
  • 2021-06-24
  • 2021-09-02
  • 2021-09-20
  • 2021-04-30
  • 2022-02-10
相关资源
相似解决方案