• 文件操作,内置函数open()


    先看看官方说明:

    The default mode is 'r' (open for reading text, synonym of 'rt'). For binary read-write access, the mode 'w+b' opens and truncates the file to 0 bytes. 'r+b' opens the file without truncation.
    
    As mentioned in the Overview, Python distinguishes between binary and text I/O. Files opened in binary mode (including 'b' in the mode argument) return contents as bytes objects without any decoding.
    In text mode (the default, or when 't' is included in the mode argument), the contents of the file are returned as str, the bytes having been first decoded using a platform-dependent encoding or using the specified encoding if given.
    

    r、w、a 为打开文件的基本模式,分别对应只读、只写、追加模式。
    b、t、+ 与以上的文件打开模式组合使用,分别对应二进制模式,文本模式,读写模式。

    整理一下:

    ———————————————————————————————————————————————————————————————————————————————————————
    mode    |   描述
    ———————————————————————————————————————————————————————————————————————————————————————
    r       |   以只读方式打开文件(默认),如果文件不存在,则抛出FileNotFoundError异常
    ———————————————————————————————————————————————————————————————————————————————————————
    w       |   以只写方式打开文件。指针在开头,文件不存在时创建,文件存在时,则清空再写入新内容。
    ———————————————————————————————————————————————————————————————————————————————————————
    a       |   以追加只写方式打开文件,指针移到文件末尾。文件不存在时创建。
    ———————————————————————————————————————————————————————————————————————————————————————
    x       |   以追加方式打开文件,文件不存在时创建,文件存在时抛出FileExistsError异常。
    ———————————————————————————————————————————————————————————————————————————————————————
    r+      |   读写,指针在开头,可以写到文件任何位置
    ———————————————————————————————————————————————————————————————————————————————————————
    w+      |   读写,清空文件内容
    ———————————————————————————————————————————————————————————————————————————————————————
    a+      |   读写,追加,只能写在文件末尾
    ———————————————————————————————————————————————————————————————————————————————————————
    

    打开文件

    f = open('path','mode')
    

    将内存数据写入文件

    f.flush()
    

    关闭文件

    f.close()
    

    创建一个文件

    # vim users.txt
    keith1:18:110
    keith2:19:111
    keith3:20:112
    keith4:21:113
    

    查看帮助文档

    >>> f=open('users.txt')
    >>> type(f)
    <class '_io.TextIOWrapper'>
    
    >>> help(open)
    >>> help(f)
    
    >>> dir(f)
    ['_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']
    

    在对文件进行操作后,一定要牢记一件事情:file.close()。
    如果不关闭,它还驻留在内存中,后面又没有对它的操作,既浪费内存空间,也增加了文件的安全风险。

    有另一种方法能够不用手动close()文件,那就是使用with的方式打开文件。

    >>> with open('users.txt') as f:
    ...     print(f.read())
    ...
    keith1:18:110
    keith2:19:111
    keith3:20:112
    keith4:21:113
    

    读文件

    f.read(size)         读取文件size个字节内容,返回字符串。如果不指定size,则读取全部内容。
    f.readline(size)     读取文件一行size个字节,返回字符串。如果不指定size,则显示一整行。
    f.readlines(hint)    读取文件所有行,返回列表。如果hint小于一行的字符数则读取一行,如果hint大于一行小于两行字符数则读取两行,以此类推。
    
    >>> help(f.read)
    Help on built-in function read:
    
    read(size=-1, /) method of _io.TextIOWrapper instance
        Read at most n characters from stream.
    
        Read from underlying buffer until we have n characters or we hit EOF.
        If n is negative or omitted, read until EOF.
    
    >>> help(f.readline)
    Help on built-in function readline:
    
    readline(size=-1, /) method of _io.TextIOWrapper instance
        Read until newline or EOF.
    
        Returns an empty string if EOF is hit immediately.
    
    >>> help(f.readlines)
    Help on built-in function readlines:
    
    readlines(hint=-1, /) method of _io.TextIOWrapper instance
        Return a list of lines from the stream.
    
        hint can be specified to control the number of lines read: no more
        lines will be read if the total size (in bytes/characters) of all
        lines so far exceeds hint.
    
    >>> f.read()
    'keith1:18:110
    keith2:19:111
    keith3:20:112
    keith4:21:113'
    
    >>> f.readline()
    'keith1:18:110
    '
    
    >>> f.readlines()
    ['keith1:18:110
    ', 'keith2:19:111
    ', 'keith3:20:112
    ', 'keith4:21:113']
    

    在python中,' '表示换行,这也是unix系统中的规范。但是在windows系统中,用' '表示换行。不过还好,python在处理的时候,会自动将' '转换为' '。

    遍历文件

    >>> f=open('users.txt')
    >>> for line in f:
    ...      print(line, end='')
    ...
    keith1:18:110
    keith2:19:111
    keith3:20:112
    keith4:21:113
    

    for循环是一行一行地读取文件内容,每次扫描一行,遇到结束符号 表示本行结束。

    文件指针

    指针就是文件操作的位置。

    获取指针当前位置

    >>> help(f.tell)
    Help on built-in function tell:
    
    tell() method of _io.TextIOWrapper instance
        Return current stream position.
    

    移动指针

    >>> help(f.seek)
    Help on built-in function seek:
    
    seek(cookie, whence=0, /) method of _io.TextIOWrapper instance
        Change stream position.
    
        Change the stream position to the given byte offset.
    	The offset is interpreted relative to the position indicated by whence.
    	Values for whence are:
    
        * 0 -- start of stream (the default); offset should be zero or positive 默认为起始位置,偏移量为0或者正数。
        * 1 -- current stream position; offset may be negative 当前位置,偏移量可以是负数。
        * 2 -- end of stream; offset is usually negative 结束位置,偏移量通常是负数。
    
        Return the new absolute position.
    

    cookie表示相对whence的偏移量。
    whence表示从何处开始。

    >>> f=open('users.txt')
    >>> f.tell()
    0
    >>> f.read(2)
    'ke'
    >>> f.tell()
    2
    >>> f.read(3)
    'ith'
    >>> f.tell()
    5
    >>> f.seek(0)
    0
    >>> f.tell()
    0
    

    需要注意的是,seek移动指针之前默认先会调用flush。

    参考:
    https://docs.python.org/3/library/functions.html#open
    https://docs.python.org/3/library/io.html#io.TextIOBase.seek
    http://www.runoob.com/python/file-seek.html
    https://docs.python.org/3/library/io.html#io.IOBase.writelines

  • 相关阅读:
    Linux学习笔记(第一章)
    C#中的抽象类有什么好处?究竟它是用来干事什么的呢?
    C#中的 增 、删、 改、 查功能
    在Visual C#中用ListView显示数据记录
    10.14JDBC之数据库连接池之C3P0
    10.19JDBC之使用C3P0连接池重新实现JDBCUtils方法
    10.12JDBC之DAO实现类的优化
    10.13JDBC之数据库连接池
    RhinoMock入门(3)——4种Mock类型
    wse说谈(3)——策略,用户令牌
  • 原文地址:https://www.cnblogs.com/keithtt/p/7623069.html
Copyright © 2020-2023  润新知