zoukankan      html  css  js  c++  java
  • 文件相关知识

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

    用户/应用程序
    操作系统(文件)
    计算机硬件(硬盘)

    2.为何要用文件
    用户/应用程序可以通过文件将数据永久保存的硬盘中
    即操作文件就是操作硬盘

    用户/应用程序直接操作的就是文件吗,对文件进行所有的操作,
    都是在向系统发送系统调用,然后再有操作系统将其转化成具体的硬盘操作


    3.如何用文件:open()
    控制文件读写内容的模式:t和b
    强调:t和b不能单独使用,必须r/w/a连用


    t文本(默认的模式)
    1.读写都是以str(Unicode)为单位的
    2.文本文件
    3.必须为encoding='utf-8'


    b二进制/bytes

    控制文件读写操作的模式
    r 只读模式
    # w 只写模式
    # a只追加写模式
    # +:r+ w+ a+

     t文本(默认的模式)
    # 1.读写都是以str(Unicode)为单位的
    # 2.文本文件
    # 3.必须为encoding='utf-8'


    #没有指定encoding参数操作系统会使用自己默认的编码
    #linux系统默认utf-8
    #windos系统默认gbk

    with open(r'aaa/a.py',mode='rt',encoding='utf-8') as f1 :
    res=f1.read() #t模式会将f.read()读出的结果解码成Unicode
    print(res,type(res))


    f1.write('哈哈哈')



    # 内存:utf-8格式的二进制------------------解码-----------------》unicode
    #硬盘(c.txt内容:utf-8格式的二进制)

    # 文件对象又称为文件句柄

    # with open(r'aaa/a.py',mode='rt') as f1 : #fi=open(r'aaa/a.py',mode='rt')
    # res=f1.read()
    # print(res)

    #
    # with open(r'aaa/a.py', mode='rt') as f1,\
    # open(r'bbb/b.py', mode='wt') as f2:
    # res1 = f1.read()
    # res2 = f2.write(res1)
    # print(res1)
    # print(res2)

    # f1.clos()
    # f2.clos()


    B模式
    # 控制文件读写内容的模式
    # t:
    # 1.读写都是以字符串(unicode)为单位
    # 2.只能针对文本文件
    # 3.必须指定字符编码


    # b:binary模式
    # 1.可以针对任何模式
    # 2.读写都是以bytes(二进制)为单位
    # 3.不能指定字符编码(encoding)
    # 错误演示:t模式只能读文本文件
    # with open(r'艾哈散客价到府.mp4',mode='rb') as f:




    # bytes==>二进制
    # 得到bytes的三种方法
    # 1.字符串编码之后的结果
    # '上'.encode('utf-8')
    # bytes('上',encoding='utf-8')
    # 2.'b'必须是纯英文字符
    # 3.b模式下打开文件,f.red()读出内容


    #总结:1.在操作文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更加方便
    # 2.针对非文本文件时(如图片,视频,音频等)只能使用b模式



    # f.read() #硬盘的二进制读入内存-》》t模式下会将读入的内容进行decode解码操作


    # with open(r'艾哈散客价到府.mp4', mode='rb') as f:
    # res = f.read() # 硬盘的二进制读入内存--》b模式下,不做任何转换,直接读入内存
    # print(res, type(res)) # bytes类型--》当成二进制



    # with open(r'a.py', mode='rb') as f:
    # res=f.read() #utf-8的二进制--》unicode
    # print(res)


    # 文件拷贝工具
    # A=input('请输入复制源文件地址:').strip()
    # B=input('请输入粘贴源文件地址:').strip()
    # with open('{}'.format(A),mode='rt',encoding='utf-8') as f :
    # with open('{}'.format(B),mode='wt',encoding='utf-8') as f1:
    # res=f.read()#内存占用过大
    # f1.write(res)

    # for c in f:
    # f1.write(c)



    #循环读取文件
    #方式一:自己控制每次读取的数据的数据量
    # with open(r'a.py',mode='rb') as f:
    # while True:
    # res=f.read(60)
    # if len(res)==0:
    # break
    # print(len(res))






    #方式二:以行为单位读,当一行内容过长时会会导致一次性读入内容的数据量过大
    # with open(r'a.py',mode='rt',encoding='utf-8') as f:
    # for ine in f:
    # print(ine)


    # with open(r'a.py',mode='rb') as f:
    # for ine in f:
    # print(ine)


    # with open(r'huh.jpg',mode='rt',encoding='utf-8') as f:
    # for ine in f:
    # print(ine)

    控制文件指针操作
    #指针移动的单位都是以bytes/字节为单位
    #只有一种情况特殊
    # t模式下的read(n),n代表的是字符个数

    # with open('aaaa',mode="rt",encoding='utf-8') as f:
    # res=f.read(4)#abc你()4个字符
    # print(res)

    #f.seek(n,模式):n指的是移动的字节个数
    #模式
    #0:参照物是文件的开头位置
    # f.seek(9,0)
    # f.seek(3,0)#3

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

    #2:参照物是当前指针所在位置,应该倒着移动
    # f.seek(-9,2)#3
    # f.seek(-3,2)#9


    #强调:只有0模式可以再t下使用,1、2必须在b模式下使用

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

    # 示范:
    # with open('aaaa',mode="rb") as f:
    # f.seek(9,0)
    # f.seek(3,0)#3
    # # print(f.tell())
    # f.seek(4,0)#报错因为不完整
    # res=f.read()
    # print(res.decode('utf-8'))
    文件操作的其他方法
    #一:读相关操作
    #1.readline:一次读一行
    with open(r'a.py',mode='rt',encoding='utf-8') as f:
    # res1=f.readline()
    # res2=f.readline()
    # res3=f.readline()
    # print(res2)


    while True:
    line=f.readline()
    if len(line)==0:
    break
    print(line)


    # 2.readlines
    # with open(r'a.py',mode='rt',encoding='utf-8') as f:
    # res=f.readlines()
    # print(res)

    #强调:
    #f.read()与f.readlines()都是将内容一次性读入内存,如果内容过大会导致内存溢出
    # ,若还想全部读入内存,则必须分多次读入。



    #二:写相关操作
    #f.writelines():将列表里的元素循环写入文件
    # with open(r'h.py',mode='wt',encoding='utf-8') as f:
    # f.write('111\n222\n333\n')


    # o=['111\n','222','333']
    # # for c in o:
    # f.write(c)


    # f.writelines(o)


    #补充一:如果是纯英文字符,可以直接加前缀b得到bytes类型
    # with open(r'h.py', mode='wb') as f:
    # o=[b'11s1s1s1f1',b'add5w4r4r4we',b'df84sfwf4']
    # f.writelines(o)

    #补充2:'上'.encode('utf-8')等同于bytes('上',encoding='utf-8')
    # o=[bytes('上啊',encoding='utf-8'),
    # bytes('冲啊',encoding='utf-8'),
    # bytes('上啊',encoding='utf-8')
    # ]
    # f.writelines(o)


    #补充3.flush:
    # with open(r'h.py',mode='wt',encoding='utf-8') as f:
    # f.write('哈哈哈')
    # f.flush()# 写完一次立马写入硬盘 大多数情况不要执行


                          文件修改的2种方式
    # 方式一:文本編輯器採用该种方式
    # with open(r'c.txt', mode='rt', encoding='utf-8') as f:
    # res = f.read()
    # rt = res.replace('a','帅哥')
    # with open(r'c.txt', mode='wt', encoding='utf-8') as f1:
    # f1.write(rt)
    # 缺点:如果文件内容过大则会占用计算机内存,影响运行速度



    # 方式二:
    # import os
    #
    #
    #
    # with open(r'c.txt', mode='rt', encoding='utf-8') as f,\
    # open(r'ac.txt', mode='wt', encoding='utf-8') as f1:
    # for res in f:
    # f1.write(res.replace('a','帅哥'))
    #
    # os.remove('c.txt')
    # os.rename('ac.txt','c.txt')




  • 相关阅读:
    非Ajax实现客户端的异步调用
    转:IE7远程客户端本地预览图片的解决办法(兼容IE6)
    How to Persist With Your Goals When the Going Gets Tough 编程爱好者
    How to Persist When You Really Want to Quit 编程爱好者
    JAVA环境变量设置
    手机连接WIFI总掉线的解决方法
    servlet中web.xml配置详解(转)
    ArrayList的contains方法[转]
    eclipse下 alt+/快捷键方式失效的解决
    关于数据结构,关于算法,关于hash桶算法
  • 原文地址:https://www.cnblogs.com/ltyc/p/13160971.html
Copyright © 2011-2022 走看看