ptyhon之文件处理

文件

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

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

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

3、如何用文件

      # f = open(r'a.txt', mode='rt', encoding='utf-8')
      # print(f)  # 文件对象、文件句柄

        #res = f.read()
        #print(res)

          #f.close()   关闭文件

          # print(f)

          # f.read()   读取文件

          # del f      删除文件
with语句
with open('a.txt', mode='rt', encoding='utf-8') as f,\
    (打开)(文本文件)(读写操作和内容模式)(编码方式)
        open('b.txt',mode='wt',encoding='utf-8') as f1:
    pass

文件打开模式

  1、控制文件读写操作的模式

          r(默认)读

          w       写

          a       追加写

    2、控制文件读写内容的模式

        t(默认的):读写都是以字符串为单位的,只适用于文件文件,必须指定encoding参数

        b:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数


    r模式:只读模式,如果文件不存在则报错,文件存在则文件指针处于文件开头

        # f = open('a.txt',mode='rt',encoding='utf-8')

        # print('='*50)   #打印‘=’50行

        # print(f.read()) #读文件f

        # print(f.readable())  #判断是否只读  输出True

        # print(f.writable())  #判断是否只写  输出Flase

        # 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())

文件操作其他方法


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

                # lines = f.readlines()   #一下子全读出来

                # print(lines)

                # 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:  #循环将lines里的给line

                #f.write(line)      


                # f.writelines(lines)   #一下子写入


                #     f.write('hello')

                #     f.flush()   #刷新
                # f.writelines('hello')

文件指针的移动

    大前提:只有t模式下的,f.read(n)中的n代表的是字符个数,除此以外,关于指针的移动,单位都是字节bytes


        # 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)
            ps:只有0模式可以t下使用,其中1和2模式只能在b模式下使用,但是无论在t模式还是b模式下,移动的都是字节个数

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

                # print(f.tell())    #告诉我们指针移动了多少

                # f.seek(9,0)

                # f.seek(3,0)



        # with open('a.txt',mode='rb') as f:

        #     print(f.tell())

        #     f.seek(9,1)

        #     f.seek(3,1)

        #     f.seek(0,2)

        # with open('a.txt',mode='ab') as f:

        #     print(f.tell())
#文件修改的原理:

	把硬盘数据读入内存,在内存修改完毕后,再覆盖回硬盘

		具体来说又分为两种方案

		方案一:

			# with open('test.txt',mode='rt',encoding='utf-8') as f:

			#     data = f.read()

			# with open('test.txt',mode='wt',encoding='utf-8') as f:

		#     f.write(data.replace('egon','EGON'))


		方案二:

		import os   #os模块

		with open('test.txt',mode='rt',encoding='utf-8') as f1,\
        	open('.test.txt.swp',mode='wt',encoding='utf-8') as f2:
    		for line in f1:
        		f2.write(line.replace('EGON',"egon"))

		os.remove('test.txt')    #删除
		os.rename('.test.txt.swp','test.txt')  #改名字

















posted @ 2021-06-23 15:27  zhutianyu  阅读(48)  评论(0)    收藏  举报