zoukankan      html  css  js  c++  java
  • Python基础第9课-文件读写

    IO 编程

        输入(Input)、输出(Output)

    读写文件

    操作系统提供文件视角 ----- 用户申请读写文件 ----- 操作系统准许后提供读写接口
     
            读文件
            f = open('/Users/michael/test.txt', 'r')
    标示符'r'表示读
    文件存在,则返回文件描述符;
    文件不存在,抛出异常 IOError 
    try:
    f = open('/path/to/file', 'r')
    print(f.read())
    finally:
    if f:
    f.close()
    但是每次都这么写实在太繁琐,所以,Python 引入了 with 语句来自动帮我们调用 close() 方法:
    with open('/path/to/file', 'r') as f:
    print(f.read())
    这和前面的 try ... finally 是一样的,但是代码更佳简洁,并且不必调用 f.close() 方法。
     
    如果文件很小, read() 一次性读取最方便;
    如果不能确定文件大小,反复调用 read(size) 比较保险;
    如果是配置文件,调用 readlines() 比较方便;
     
    写文件
    写文件和读文件是一样的,唯一区别是调用 open() 函数时,传入标识符'w' 或者 'wb' 表示写文本文件或写二进制文件:
     f = open('/Users/michael/test.txt', 'w')
    你可以反复调用 write() 来写入文件,但是务必要调用 f.close() 来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用 close() 方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用 close() 的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
    同样也有with ... as ..
    with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')

    操作文件和目录

    工作目录、相对路径、绝对路径
    # 查看当前目录的绝对路径:
    >>> os.path.abspath('.')
    '/Users/michael'
    # 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
    >>> os.path.join('/Users/michael', 'testdir')
    '/Users/michael/testdir'
    # 然后创建一个目录:
    >>> os.mkdir('/Users/michael/testdir')
    # 删掉一个目录:
    >>> os.rmdir('/Users/michael/testdir')
    # 对文件重命名:
    >>> os.rename('test.txt', 'test.py')
    # 删掉文件:
    >>> os.remove('test.py')
    os.path.split() 函数,可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名:
    >>> os.path.split('/Users/michael/testdir/file.txt')
    ('/Users/michael/testdir', 'file.txt')
    os.path.splitext() 可以直接让你得到文件扩展名,很多时候非常方便:
    >>> os.path.splitext('/path/to/file.txt')
    ('/path/to/file', '.txt')
     
    最后看看如何利用 Python 的特性来过滤文件。
    比如我们要列出当前目录下的所有目录,只需要一行代码:
    >>> [x for x in os.listdir('.') if os.path.isdir(x)]
    ['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim',
    'Applications', 'Desktop', ...]
    要列出所有的 .py 文件,也只需一行代码:
    >>> [x for x in os.listdir('.') if os.path.isfile(x) and
    os.path.splitext(x)[1]=='.py']
    ['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py',
    'urls.py', 'wsgiapp.py']
     
    实例:                        -------->31.py
    #  列出目录下的所有文件(包括文件夹中的文件)
    import os
    def listfiles(dir,i):
    for x in os.listdir(dir):
    x=os.path.join(dir,x)
    if os.path.isfile(x):
    print((i-1)*" ","|---",x,"-----file")
    else:
    print((i-1)*" ","|---",x, " -------->dir")
    listfiles(x,i+1)

    listfiles("F:pytest",0)
    
    
    
    

    序列化

            内存、磁盘、程序运行过程
     
    我们把变量从内存中变成可存储或传输的过程称之为序列化,在 Python中叫 pickling
    序列化
    Python 提供了 pickle 模块来实现序列化。
    >>> import pickle
    >>> d = dict(name='Bob', age=20, score=88)
    >>> pickle.dumps(d)
    b'x80x03}qx00(Xx03x00x00x00ageqx01Kx14Xx05x00x00x00score
    qx02KXXx04x00x00x00nameqx03Xx03x00x00x00Bobqx04u.'
     pickle.dump() 直接把对象序列化后写入一个 file-like Object(什么是file-like object):
    >>> f = open('dump.txt', 'wb')    
    >>> pickle.dump(d, f)
    >>> f.close()
    反序列化
    >>> f = open('dump.txt', 'rb')
    >>> d = pickle.load(f)
    >>> f.close()
    >>> d
    {'age': 20, 'score': 88, 'name': 'Bob'}
    ---------------------------------------->32.py
    序列化成JSON
    Python 内置的 json 模块提供了非常完善的 Python 对象到 JSON 格式的转换。我们先看看如何把 Python 对象变成一个 JSON:同样的dumps和load方法(dumps一个对象的时候,需要类内自定义一个class2dict方法print(json.dumps(s, default=student2dict)),或者使用lambda表达式   json.dumps(s, default=lambda obj: obj.__dict__) )
    >>> import json
    >>> d = dict(name='Bob', age=20, score=88)
    >>> json.dumps(d)
    '{"age": 20, "score": 88, "name": "Bob"}'
    ---------------------------------------->33.py
     
     

    参考参数:

     
    模式描述
    t 文本模式 (默认)。
    x 写模式,新建一个文件,如果该文件已存在则会报错。
    b 二进制模式。
    + 打开一个文件进行更新(可读可写)。
    U 通用换行模式(不推荐)。
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
     
     
    序号方法及描述  
    1

    file.close()

    关闭文件。关闭后文件不能再进行读写操作。

     
    2

    file.flush()

    刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

     
    3

    file.fileno()

    返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

     
    4

    file.isatty()

    如果文件连接到一个终端设备返回 True,否则返回 False。

     
    5

    file.next()

    返回文件下一行。

     
    6

    file.read([size])

    从文件读取指定的字节数,如果未给定或为负则读取所有。

     
    7

    file.readline([size])

    读取整行,包括 " " 字符。

     
    8

    file.readlines([sizeint])

    读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。

     
    9

    file.seek(offset[, whence])

    设置文件当前位置

     
    10

    file.tell()

    返回文件当前位置。

     
    11

    file.truncate([size])

    截取文件,截取的字节通过size指定,默认为当前文件位置。

     
    12

    file.write(str)

    将字符串写入文件,返回的是写入的字符长度。

     
         
     
  • 相关阅读:
    2020.08.28【周报】
    区间合并【排序、栈】
    1042 数字0-9的数量【解题数分DP】
    asp.net数据分页方法
    纯css面板插件,自适应,多样式
    c#winform图表控件使用示例
    使用妹子UI开发的体验分享
    阿里云储存代码整理(由三卷天书整理)
    测试程序的时候用到写参数或者错误日志的几个方法,用来方便发现错误
    fineUI表格控件各属性说明
  • 原文地址:https://www.cnblogs.com/MarmaladeCat/p/0b1b464cb62b4d4075cdc45770ab856a.html
Copyright © 2011-2022 走看看