zoukankan      html  css  js  c++  java
  • python学习笔记之--文件的操作

    为什么要用文件来操作数据?
    在cmd下操作时,变量是放在内存中使用的,如果cmd一旦关闭变量就没有了下次就无法继续使用,所以就有了文件存在的意义。
    数据的保存:
    1 内存:常用的变量都是在内存里面的
    2 文件:文本内容、二进制的文件内容
    3 数据库:保存
     
     
    操作文件的流程:
    1 要读取的文件,路径一定要存在。
    2 打开存在的文件:open函数 
      参数1:文件的路径,相对的,绝对的
      参数2:打开文件的模式,rwa
      编码:encoding="utf-8"
    3 操作文件的内容,读、写(把原有内容清空在写)、追加
    (原有内容不变,在它的最后面写上新的内容)
    4 文件关闭掉。
     
     
    D盘新建a.txt文件(新建文件的时候,默认保存是ansi编码(gbk),然后也可以选择utf-8。)
    a.txt
    什么1111
    fef
    好好学习

    #判断文件在不在

    >>> import os.path  #引入路径判断的包
    #判断文件在不在用exists
    >>> os.path.exists("d:\a.txt")   #绝对路径
    True
    >>> os.path.exists(r"d:a.txt")  #文件路径写\,或者前面加r
    True
    >>> os.path.exists("a.txt")   #相对路径
    False
    >>>
    >>> if os.path.exists("d:\a.txt"):
    ...     print("文件存在可以操作")
    ...
    文件存在可以操作
    >>>
    绝对路径:从盘符开始完整的路径,, 例如:e:	est	est1a.txt
    相对路径:在当前的目录下,以它为根目录,使用相对路径进行查找,,例如:在e:	est	est1盘下执行py程序,程序里面使用了相对路径a.txt; 那么它对应的绝对路径: e:	est	est1a.txt

    >>> os.getcwd()  #获取当前所在路径
    'C:\Users\dell'
    >>>
     
     
    #打开文件
    >>> fp =open(r"d:a.txt","r",encoding="utf-8")   #打开文件,有三个常用的参数,fp是文件句柄
    #open函数,如果没有写模式,
    #默认是r模式,也就是读模式
    #没有写编码,那么就是gbk
    >>> fp   #句柄:指向磁盘文件在内存或者磁盘上的位置指针
    <_io.TextIOWrapper name='d:\a.txt' mode='r' encoding='utf-8'>
    >>> dir(fp)
    ['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'writelines']
    >>> fp.read()  #read读取全部文件内容
    ''
    >>> fp.seek(0,0)  #上一步已经读取了文件,文件的游标会指到文件的最末尾,如果想再次读取文件内容需要用seek将文件游标返回到文件最开始的位置
    0 
    >>> fp.read()
    '1111
    fef
    好好学习'
    >>> fp.close()  #关闭文件

    为什么一定要关闭文件?

    • 文件不关闭,写入的内容太少,实际写的内容并不会立刻写到磁盘,其他文件操作可能会受限。
    • 写入场景:一次写不多的内容,比如:100个字操作系统会把内容存在内存,不写入文件。

                          什么时候写入呢?
                         要等待写入的内容到一定量,64k才会写入。
                         fp.fluse() #立刻写入文件的方法
                         close之后,就会把所有待写入的内容保存到文件中

    程序中不close会有什么影响:
    1 python程序在执行完毕了,会自动close.
    2 对于服务器端,不close,可能造成数据不真,正写入到文件里
    3 对于服务器端,每次打开一个文件都不close
    会把文件句柄(node)占用光.操作系统上打开文件是
    有限制:65535个。达到65535个node被占用的时候
    操作系统就死掉了,句柄耗尽。
     
    结论:读写文件一定要close
    问题:服务器端的程序是一直在执行?还是一会儿执行一会儿不执行?
    服务器端的服务宗旨:尽管你可能不来,但是我们一定死等。
     
    fp.read():读取文件的全部内容
    >>> fp.readline()   #readline每次读一行
    '1111
    '
    >>>
    数据量大:readline()
    优点:省内存
    缺点:速度慢
    数据量不大:read()把数据读到内存,
    优点:操作起来很快,速度快
    缺点:占内存
    
    >>> fp.seek(0,0)
    0
    >>> fp.read(1)   #只读一个字
    ''
    >>> fp.tell()   #tell告诉你文件游标所在位置,读取的是字节数
    3 
    
    
    #我想指定读哪一行怎么办?
    >>> fp.seek(0,0)
    0
    >>> fp.readlines()   #readlines()读取每一行放列表里
    ['什么1111
    ', 'fef
    ', '好好学习']
    >>> fp.seek(0,0)
    0
    >>> lines =fp.readlines()
    >>> lines[1]  #然后在用坐标取
    'fef
    '
    >>> lines[0]
    '什么1111
    '
    >>>
    
    
    不允许使用readlines,请计算一个文件的行数
    #遍历读所有内文件的内容的方式:
    >>> fp.seek(0,0)
    0
    >>> for line in fp:
    ...     print(line,end="")
    ...
    什么1111
    fef
    好好学习>>>
    >>> fp.seek(0,0)
    0
    >>> count =0
    >>> for line in fp:
    ...     count +=1
    ...
    >>> count
    3
    while实现:
    >>> count =0
    >>> while fp.readline():
    ...     count+=1
    ...
    >>> print(count)
    5
    #写文件
    #w模式不需要文件一定存在,如果文件不在会创建一个新的然后写,如果在且文件里有内容,会先清空原有内容后写入
    >>> fp =open("d:\a.txt","w",encoding="utf-8")
    >>> fp.write(1111)   #写入文件内容必须是字符串,否则报错
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: write() argument must be str, not int
    >>> fp.write("123456")
    6
    >>> fp.flush()  #用flush主动写入,或者close文件自动写入。该函数是将缓冲区中的内容写入硬盘
    >>>
    
    #插入
    #思路:先读取要插入位置的前面部分,在读取要插入位置的后面部分,然后把三部分拼接写入
    #实现: >>> fp = open("e:\a.txt","r+",encoding="utf-8") >>> two_word=fp.read(2) >>> two_word '光荣' >>> last_two_word=fp.read(2) >>> last_two_word '之路' >>> fp.seek(0,0) 0 >>> fp.write(two_word+"gr"+last_two_word) 6 >>> fp.close() >>> #写入的模式
    r:read读
    w:write写
    a:append追加
    w+:清空原有内容后,进行读写的模式 r+:保留原有内容后,进行读写的模式,写入内容的位置跟游标位置有关 a+:保留原有内容后,进行读写的模式,且写入内容永远在文件的最后一行

    rb:读二进制
    wb:写二进制
    ab:追加二进制
     
     
    #r+的细节示例:
    >>> fp =open("d:\a.txt","r+",encoding="utf-8")
    >>> fp.read()
    '123456
    78
    9
    101112'
    >>> fp.write("好好学习")  #写入的时候未移动游标,游标在最末尾的位置,r+就会在最后继续写,前面原有内容不变
    4
    >>> fp.seek(0,0)
    0
    >>> fp.read()
    '123456
    78
    9
    101112好好学习'
    >>> fp.close()
    >>>
    >>>
     
    >>> fp = open("d:\a.txt","r+",encoding="utf-8")
    >>> fp.seek(0,0)   #写入前把游标移动到最开始的位置,在用r+写入时会从游标所在的位置覆盖写,其他内容不变
    0
    >>> fp.write("hahha")
    5
    >>> fp.read()
    '6
    78
    9
    101112好好学习'
    >>>
     
    小练习:将一张图片复制到另外文件名下
    复制文件:rb读取所有的内容,写入另外一个文件
    
    fp1=open("e:\1.png","rb")
    content = fp1.read()
    fp1.close()
     
    fp2=open("e:\2.png","wb")
    fp2.write(content)
    fp2.close()
    
    
    小练习:
    造100个手机号,135-138之间不等,最后是001结束。
    一个手机号11位。
    
    import random
    fp = open("e:\a.txt","w",encoding="utf-8")
    for i in range(100):
        fp.write(str(random.randint(13500000,13899999))+"001
    ")   
    fp.close()

    with方式打开文件:会默认关闭文件

    >>> with open("d:\a.txt","r",encoding="utf-8") as fp:
    ...     fp.read()
    ...
    'hahha6
    78
    9
    101112好好学习努力学习'

    原理:先执行__enter__方法,执行后执行__exit__方法

    class Sample:
        def __enter__(self):
            print("In __enter__()")
            return "Foo"
    
        def __exit__(self, type, value, trace):
            print("In __exit__()")
    
    def get_sample():
        return Sample()
    
    with get_sample() as sample:
        print("sample:", sample)
  • 相关阅读:
    终于开通了
    <input>表单元素readonly时光标仍然可见
    关于字体
    SSI架构中get***方法潜在调用
    为uploads文件夹瘦身
    在JSP里使用CKEditor和CKFinder
    centos5.5上搭建svn服务器
    多文件上传
    属性化ATL,DCOM,SIM,IID
    BSTR转换成char*
  • 原文地址:https://www.cnblogs.com/wenm1128/p/11622075.html
Copyright © 2011-2022 走看看