• 文件


      打开/创建文件(open)open()一个文件,也就生成了一个文件对象,将这个对象赋值给变量f,这样变量f就和文件对象建立了引用关系。open()函数的可选参数很多,其中参数buffer是用于指定缓存的操作。

    >>> f = open('test.txt')    # 打开文件
    >>> for line in f:    # 遍历输出文件中的每行内容
    ...     print(line)
    ...
    How to learn python?    # 在原文中,每行结束都有本行的结束符号
    ,表示换行
                         # 使用print(line)对打印出文件中的换行,自己也会输出换行
    please login python.org
    
    then you can start your learning

      关闭文件(close): close方法有两个功能,关闭文件和保存文件。

      若不想关闭文件而又要保存时,可用flushflush会刷入文件到硬盘中保存。

      write将文件的内容暂时写入内存中,执行flush才会将文件内容写入硬盘中保存,但是flush有时候不一定管用,所以保险的保存文件的方式还是执行文件关闭。

      除此之外,写入内容之后,执行一次文件读取read,也会将内容自动保存到硬盘中。

      文件操作执行完毕后,必须调用close()方法关闭文件。close方法的作用有两个:关闭文件;保存文件。若向文件中写入了新内容而没有调用close方法,则写入的内容将不会被保存到文件中。

      文件的状态:

        在os模块中,有查看文件状态的方法stat()。可查看文件的状态,比如创建日期、修改日期、文件大小等。

    >>> import os
    >>> os.stat('test.txt')
    os.stat_result(st_mode=33188, st_ino=17549, st_dev=2049, st_nlink=1, st_uid=0, st_gid=0, st_size=78, st_atime=1536029781, st_mtime=1536029723, st_ctime=1536029723)

    读文件:

      read()方法:完整的写出来应该是read(size),它有一个可选参数size。当size省略时,从光标当前位置读取文件内容至结尾;当传入size参数时,从光标当前位置读取size个字符。最终都是返回一个字符串,字符串中包含文件的换行符。

    >>> f = open('test.txt')    # 先打开文件
    >>> f.read()    # 读取文件所有内容,返回一个字符串,包含文件的换行符
    'How to learn python?
    please login python.org
    then you can start your learning
    '
    >>> f = open('test.txt')
    >>> f.read(-3)    # 传入size参数为负数,也表示从光标当前位置读取全部内容
    'How to learn python?
    please login python.org
    then you can start your learning
    '
    >>> f = open('test.txt')    # 重新打开文件
    >>> f.read(6)    # 读取前六个字符
    'How to'
    >>> f.read(7)    # 光标从第七个字符开始继续读取后面的七个字符
    ' learn '

      readline()方法:逐行读取文件内容,每次执行一次只读取一行,直到最后一行。如果还继续执行,则返回空字符串,不会报错。

    >>> f = open('test.txt')
    >>> f.readline()    # 每次执行一次只读取一行
    'How to learn python?
    '
    >>> f.readline()    # 每次执行一次只读取一行
    'please login python.org
    '
    >>> f.readline()    # 直到读取完最后一行
    'then you can start your learning
    '
    >>> f.readline()    # 继续执行,返回空字符串,不报错
    ''

      此外readline()方法还可传入size参数,表示读取相应行的size个字符。当size小于相应行的字符数,若继续执行readline(size)则会接着读取当前行的内容,直至读取完当前行的内容才换下一行。当size大于相应行的字符数,则只会读取这一行。读取的每行内容都保存为一个字符串,即readline方法返回的是一个字符串。

    >>> f = open('test.txt')
    >>> f.readline(5)    # 读取第一行前五个字符
    'How t'
    >>> f.readline(5)    # 继续执行,则读取第一行下五个字符
    'o lea'
    >>> f.readline(5)    # 继续执行,则读取第一行下五个字符
    'rn py'
    >>> f.readline(5)    # 继续执行,则读取第一行下五个字符
    'thon?'
    >>> f.readline(90)    # 继续执行,读完第一行内容,包含换行符
    '
    '
    >>> f.readline(90)    # size大于当前行的字符数时,不会换行继续读,只会读完当前行结束
    'please login python.org
    '

      readlines()方法:将文件中每行内容都读出来,包含每行的换行符,放到一个列表中返回。文件中有多少行,列表中就有多少个元素。

    >>> f = open('test.txt')
    # 每行内容都读出来,包含每行的换行符,放到一个列表中,每行内容为列表中的一个元素,且每个元素都是字符串
    >>> f.readlines()    
    ['How to learn python?
    ', 'please login python.org
    ', 'then you can start your learning
    ']

      可给readlines()方法传入size参数,传入参数后若参数小于一行的字符数,则返回一行。若参数大于一行的字符数,则返回多行。

      读很大的文件:当文件很大,乃至于内存空间不足,就不能使用以上读取文件的方法了。python中有一个fileinput模块,可以用来读取很大的文件。

    >>> import fileinput
    >>> for line in fileinput.input('fabfile.py'):
    ...     print(line, end='')
    ...
    from fabric.api import *
    import datetime
    
     
    env.user = 'ubuntu1'
    env.hosts = '192.168.137.132'
    ……省略后面的内容

      seek当读取文件的时候,有指针随着运动,当读取结束时,指针就移动到相应的位置。要获取当前指针所在的位置,可以用tell()方法;要重置指针的位置,可以用seek()方法,它能根据偏移量移动指针。

    >>> f = open('test.txt')
    >>> f.read(5)    # 读取前五个字符,此时指针位于第五个字符后面
    'How t'
    >>> t.tell()    # 获取指针的位置
    5
    >>> f.read(15)  
    'o learn python?'
    >>> f.tell()    # 获取指针的位置
    20
    >>> f.seek(0)    # 调用seek方法,重置指针位置,这里是将指针定位于文件开头
    0
    >>> f.tell()    # 指针位于文件开头
    0
    >>> f.read(5)    # 重新读取文件前五个字符
    'How t'
    >>> f.seek(22)    # 调用seek方法,重置指针位置,这里是将指针定位于第22个字符后
    22
    >>> f.tell()
    22

      seek(offset[, whence])是这个函数的完整形式,以上我们忽略了whence,默认whence=0表示从文件开头计算指针偏移量。具体如下:

        默认值为0,表示从文件开头计算指针偏移量。这时的offset必须大于或等于零的整数;

        当whence=1时,表示从当前位置开始计算指针偏移量。如果offset是负数,表示从当前位置向前移动;如果offset是正数,表示向后移动;

        当whence=2时,表示相对于文件末尾的移动。

      需要注意的是,Python3不允许非二进制方式打开的文件,相对于指针当前位置或文件末尾的定位。就是说,如果想定位到指针当前位置或文件末尾,可以用python2.7或者在python3中用二进制的方式打开文档。

      文件对象与迭代:文件对象是可迭代的对象

      判断一个对象是否可迭代的方法:

        1. 使用dir()查看该对象的方法中是否有__iter__

    >>> dir(list)
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

        2. hasattr(obj, '__iter__')的布尔值

    >>> hasattr(list, '__iter__')
    True

        3. 使用collections标准库中的Iterable进行判断

    >>> import collections
    >>> isinstance(321, collections.Iterable)
    False
    >>> isinstance('qwe', collections.Iterable)
    True

      文件b的模式:

        1. b模式下不能再指定encoding编码;

        2. 字符串转化为二进制,必须要进行编码;

        3. 字符串对象可直接调用encode()方法进行编码。

    >>> '字符串'.encode('utf-8')
    b'xe5xadx97xe7xacxa6xe4xb8xb2'

      使用文件操作的其它注意方面:

      1. seek以字节为单位进行定位,在python2中可以直接用;而python3是以utf-8编码,所以在python3中使用seek的模式23时,要将文件以二进制的方法打开。
    >>> f = open('test.py', 'rb')    # 以二进制方式打开
    >>> f.seek(16, 1)
    16
    >>> f.tell()
    16
    >>> f.seek(-5, 1)
    11
    >>> f.seek(-10, 2)
    54
    >>> f.seek(10, 2)
    74

        2. 一个汉字占三个字节,一个字符占一个字节

        3. 循环文件的推荐方式:

    f = open('test.txt')
    for line in f:    # 循环一行给一行,相当于延迟迭代
    pass
    而尽量不要用这种方式:
    f = open('test.txt')
    for line in f.readlines():    # 先将所有的行取出放到内存中再循环
    pass

        4. 文件写入的类型必须是字符串类型;读取出来也全是字符串的形式;

        5. with可以同时打开多个文件;

    >>> with open('test.py') as f1,
    ...     open('demo.txt', 'w') as f2:    # with同时打开两个文件
    ...     data = f1.read()    # 文件读取
    ...     f2.write(data)    # 文件写入(备份)
    ...
    50

        6. 要确保文件得以关闭,可使用一条try/finally语句,并在finally语句中调用close

        with语句在写入文件时,到达该语句末尾时,将自动关闭文件,即便出现异常也是如此。

    >>> try:
    ...     f = open('test.py')
    ...     f.read()
    ... finally:    # finally中处理文件关闭
    ...     f.close()
    ...
    'qwertgfdsxcvb
    qwe123432
    1234876543
    人生苦短,我用python!
    '

        7. 使用print可以用来写入文件,相当于write方法

        8. print写入文件的方式:

    f = open('filename', 'w')
    print('123456', 'qwertr', file=f) # 相当于连续执行f.write('123456')和f.write('qwertr
    ')

    文件模式

    模式

    说明

    r

    以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

    w

    打开一个文件只用于写入。如果该文件已存在则将其清空。如果该文件不存在,创建新文件。

    a

    打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的

    内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    rb

    以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。

    wb

    以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,

    创建新文件。

    ab

    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。

    也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    r+

    打开一个文件用于读写。文件指针将会放在文件的开头。

    w+

    打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

    a+

    打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会

    是追加模式。如果该文件不存在,创建新文件用于读写。

    rb+

    以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

    wb+

    以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,

    创建新文件。

    ab+

    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。

    如果该文件不存在,创建新文件用于读写。

  • 相关阅读:
    微信小程序之跨界面传参
    微信小程序简易教程
    css动画与js动画的区别
    不同浏览器兼容性的区别
    Filter学习
    FileDescriptor
    Executor框架
    Struts1的处理流程
    Struts1的实现原理
    [转]TOMCAT原理以及处理HTTP请求的过程、ContextPath ServletPath
  • 原文地址:https://www.cnblogs.com/wgbo/p/9952213.html
Copyright © 2020-2023  润新知