美文网首页
Python 学习基础整理 —— 文件读写(三)

Python 学习基础整理 —— 文件读写(三)

作者: Medivh_ | 来源:发表于2017-11-27 22:36 被阅读49次

    读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
    更多关注:
    http://www.mknight.cn

    os 模块

    在介绍读文件之前先说一下os模块。
    os.listdir(dirname):列出dirname下的目录和文件

    [medivh@medivh Documents]$ ll
    总用量 4
    -rw-rw-r--. 1 medivh medivh 2611 11月 27 21:38 s.txt  
    
    >>> import os
    >>> os.listdir('.') 
    ['s.txt']
    

    os.getcwd():获得当前工作目录

    >>> os.getcwd()
    '/home/medivh/Documents'
    

    os.curdir:返回当前目录('.')

    >>> os.curdir
    '.'
    

    os.chdir(dirname):改变工作目录到dirname

    >>> os.chdir('../')
    >>> os.getcwd()
    '/home/medivh'
    

    os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false

    >>> os.path.isdir('/')
    True
    >>> os.path.isdir('s.txt')
    False
    

    os.path.isfile(name):判断name是不是一个文件,不存在name也返回false

    >>> os.path.isfile('/')
    False
    >>> os.path.isfile('s.txt')
    True
    

    os.path.exists(name):判断是否存在文件或目录name

    >>> os.path.exists('/home')
    True
    

    os.path.getsize(name):获得文件大小,如果name是目录返回0

    >>> os.path.getsize('s.txt')
    2611
    

    os.path.abspath(name):获得绝对路径

    >>> os.path.abspath('s.txt')
    '/home/medivh/s.txt'
    

    os.path.normpath(path):规范path字符串形式
    标准化路径名,合并多余的分隔符和上层引用,这样
    都变成 A/B该字符串操作可能改变包含符号链接的路径的含义。在Windows上,还会将斜线转换成反斜线。若要标准化大小写,请使用 normcase().

    os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)

    >>> os.path.split('/home/medivh/s.txt')
    ('/home/medivh', 's.txt')
    

    os.path.splitext():分离文件名与扩展名

    >>> os.path.splitext('s.txt')
    ('s', '.txt')
    

    os.path.join(path,name):连接目录与文件名或目录

    >>> os.path.join('/home/medivh','s.txt')
    '/home/medivh/s.txt'
    

    os.path.basename(path):返回文件名

    >>> os.path.basename('/home/medivh/s.txt')
    's.txt'
    

    os.path.dirname(path):返回文件路径

    >>> os.path.dirname('/home/medivh/s.txt')
    '/home/medivh'
    

    其实常用的也就那么几个:

    • os.path.join('dirname','filename') 拼接路径
    • os.path.abspath(name):获得绝对路径
    • os.getcwd():获得当前工作目录

    文件模式

    模式详细说明

    访问模式 说明
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    简单对比

    模式 可做操作 若文件不存在 是否覆盖
    r 只能读 报错 -
    r+ 可读可写 报错
    w 只能写 创建
    w+ 可读可写 创建
    a 只能写 创建 否,追加写
    a+ 可读可写 创建 否,追加写

    读写文件

    • 标示符'r'表示读,这样,我们就成功地打开了一个文件。
    • 如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示。
    • 最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。

    文件存在时

    import os
    # 读文件
    # 拼接路径
    file_name1 = os.path.join(os.getcwd(),'tests.txt')
    f = open(file_name1,'r')
    print(f.read())
    f.close()
    #返回结果
    
    asd
    s2asd
    asd
    

    文件不存在时

    如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在。

    file_name2 = os.path.join(os.getcwd(),'tests1.txt')
    f = open(file_name2,'r')
    print(f.read())
    f.close() 
    
    #返回结果
    Traceback (most recent call last):
      File "/home/medivh/gitlab/fox/fox/test.py", line 11, in <module>
        f = open(file_name2,'r')
    FileNotFoundError: [Errno 2] No such file or directory: '/home/medivh/gitlab/fox/fox/tests1.txt'
    
    

    由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

    file_name2 = os.path.join(os.getcwd(),'tests1.txt')
    f = open(file_name2, 'r')
    try:
        print(f.read())
    finally:
        if f:
            f.close()
    

    with ... open ... as

    Python引入了with语句来自动帮我们调用close()方法:

    with open(file_name2, 'r') as f:
        print(f.read())
    

    代码更佳简洁,并且不必调用f.close()方法。

    读文件

    read()方法:

    1、读取整个文件,将文件内容放到一个字符串变量中
    2、如果文件大于可用内存,不可能使用这种处理

    readline()方法:

    1、readline()每次读取一行,比readlines()慢得多
    2、readline()返回的是一个字符串对象,保存当前行的内容

    readlines()方法:

    1、一次性读取整个文件。
    2、自动将文件内容分析成一个行的列表。
    调用read()会一次性读取文件的全部内容,如果文件太大,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

    如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

    for line in f.readlines():
        print(line) 
    

    要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件.open('xxxx/gbk.txt', 'r', encoding='gbk')

    写文件

    写文件的话较为简单,使用f.write()就可以了。

    with open('xxx/test.txt', 'w') as f:
        f.write('Hello a!')
    

    更多关注:
    http://www.mknight.cn

    相关文章

      网友评论

          本文标题:Python 学习基础整理 —— 文件读写(三)

          本文链接:https://www.haomeiwen.com/subject/yhljbxtx.html