IO编程

Posted by LCY on April 8, 2018

本篇博客是用于记录我在学习python的基本语法中的IO编程部分的内容。基本参考廖雪峰python教程博客,我对其进行了删减和补充,附带一些自己的理解,大家可以进行部分参考,也可以直接移步至他的博客。


文件读写

  • 要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符(如果是UTF-8编码的文本文件,使用r,如果是二进制文件,使用rb;如果是写的话,就是对应的w)。必须保证你所给出的路径中,要打开的文件是存在的,如果不存在,就会抛出 IOError
>>> f=open('招聘信息.md','r')

note:可以使用文件的绝对路径和相对路径,使用相对路径时,你就得知道你现在工作的路径,如果你不知道,可以查看https://jingyan.baidu.com/article/a3a3f811d29f328da2eb8aff.html

  • 打开文件后,就可以直接调用read()方法,进行读取(但这样是一次性读取所有的内容)。

  • 最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:

>>> f.close()
  • 为了保证每次都能执行f.close()语句,可以使用try... finally...语句,形如:
    try:
      f = open('/path/to/file', 'r')
      print(f.read())
    finally:
      if f:
          f.close()
    
  • 可以使用with语法进行简化,下面语句是和上一语句完全等价的。
    with open('/path/to/file', 'r') as f:
      print(f.read())
    
  • 以上可以通过以下的图进行总结。

字符编码

  • 要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'
  • 遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
  • 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久的新贵,你一定遇到过UnicodeEncodeErrorUnicodeDecodeError 错误,每当遇到错误我们就拿着 encodedecode 函数翻来覆去的转换,有时试着试着问题就解决了,有时候怎么试都没辙,只有借用 Google 大神帮忙,但似乎很少去关心问题的本质是什么,下次遇到类似的问题重蹈覆辙,那么你有没有想过一次性彻底把 Python 字符编码给搞懂呢?在知乎上看了一个帖子还写得不错,这里就直接为大家上链接了,希望对大家有帮助。

https://zhuanlan.zhihu.com/p/25148581?utm_medium=social&utm_source=qq


操作文件和目录

操作目录

在Windows系统中,可以直接利用命令行输入操作系统提供的各种命令来完成。python内置的os模块可以直接调用操作系统提供的接口函数,完成对文件和目录的操作。

  • 操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中,这一点要注意一下。查看、创建和删除目录可以这么调用:
    # 显示当前的绝对路径
    >>> os.path.abspath('.')
    'C:\\Users\\Administrator\\Desktop'
    # 表示出需要添加的新目录
    >>> os.path.join('C:\\Users\\Administrator\\Desktop','liaochengyu')
    'C:\\Users\\Administrator\\Desktop\\liaochengyu'
    # 使用mkdir命令创建新的目录
    >>> os.mkdir('C:\\Users\\Administrator\\Desktop\\liaochengyu')
    # 使用rmdir命令删除上一级目录
    >>> os.rmdir('C:\\Users\\Administrator\\Desktop\\liaochengyu')
    

操作文件

  • 在操作文件时,必须保证你将要操作的文件在当前的工作路径下,假设在当前路径下有一文件my_story_final.jpg
    # 对文件重命名:
    >>> os.rename('my_story_final.jpg', 'my_story_final.png')
    # 删掉文件:
    >>> os.remove('my_story_final.png')
    

    note:不能实现直接的复制文件,具体可以使用shutil模块。

实用操作

  • 我们要列出当前目录下的所有目录:
    >>> [x for x in os.listdir('.') if os.path.isdir(x)]
    ['oral workshop', '文档格式']
    
  • 列出当前路径下所有的md文件:
    >>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.md']
    ['2018-4-4-Matplotlab.md', '2018-4-8-IO编程.md', '招聘信息.md', '驾考归纳.md']
    

小结

Python的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。