• Python学习笔记


    Python文件操作

      读写文件是最常见的IO操作,在磁盘上读写文件的功能都是由操作系统提供的,操作系统不允许普通的程序直接操作磁盘(大部分程序都需要间接的通过操作系统来完成对硬件的操作),所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
      Python内置了读写文件的函数,open是最常用的文件打开函数,其中codecs包中提供了open函数,该函数具有内置函数open的所有功能,并且在内部还进行了编码的处理,所以建议使用codecs.open来对文件进行处理。
     

    读取文件

      想要读取文件,那么就需要先行打开文件。

    # 格式:
    f = open(filename,mode,encoding)
    
    # filename:表示文件名。
    # mode:表示打开文件的格式。
    # encoding:表示打开的编码格式。
    

      例子:

    f = file('/etc/passwd','r')     # Python 2.x中包含file和open两个操作文件的函数,Python 3.x 中只有open,操作方法相同
    for line in f.readlines():
        line = line.strip('
    ').split(':')
        print line
    
    结果:
    ['root', 'x', '0', '0', 'root', '/root', '/bin/bash']
    ['bin', 'x', '1', '1', 'bin', '/bin', '/sbin/nologin']
    ... ...
    

    补充:

      以指定编码格式打开文件:f = open('/etc/password',encoding = 'UTF-8')
      我们把这个 f 成为文件句柄(用来标识一个文件的内存对象),包含文件名,字符集,大小,硬盘上的起始位置等等。
      f在这里就变成了一个文件迭代器,我们可以通过使用for line in f ,去循环的读取文件的每一行内容
     

    文件打开模式

      文件打开的方式有如下几种:

      • r:只读打开,文件的默认打开方式  
      • w:文件不存在会创建,存在的话,会覆盖源文件(非追加)  
      • a:只追加模式打开(不能读)  
      • r+: 读写模式(写是追加) --->常用  
      • a+: 追加读写  
      • w+:写读模式(写同样是追加) ---->不常用  
      • rb:二进制读模式(一般用来做网络传输数据的时候,因为网络传输都是基于二进制格式的,所以必须用b) python 2.x 是可以用str传输的  
      • r+b:以二进制读写模式打开  
      • w+b:以二进制写读模式打开  
      • a+b:以二进制追加及读模式打开  
      • b:使用二进制模式(特殊文件需要用文本模式传输的话,建议使用b)  
    注:
      U:表示在读取的时候,可以将‘ ’ 转换成 (与r或r+模式连用)这样的好处是方便windows上到Linux的使用
      因为回车符在windows上表示为 而Linux上 表示为
     
    扩展:
       二进制只是一个文件的编码格式,并不带表文件的内容都是01010。所以我们一个str类型的文件也是可以当成二进制文件来处理的,只不过我们把str写入文件的时候需要转换成二进制格式,才能写入:
    f = open('test.txt','rb')
    f.write('你好'.encoding())
    通过encoding就可以转换成二进制

    文件对象方法

      文件对象的内置方法有很多种,如下所示:
    fd.closed():判断文件是否被关闭,若被打开提示False,没有的话提示True
    fd.flush():把修改的内容,强制刷新到文件中去
    fd.isatty:判断是否是一个终端文件
    fd.mode:查看文件的打开模式
    fd.name:查看文件的名称
    fd.next:迭代的方法,和readline很像,区别是,next读到末尾会报错,readline会继续返回空
    fd.read:一次性读取所有内容,以字符串的方式存取
    fd.readable():判断文件是否可读
    fd.readlines:一次性读取所有内容,以列表的方式存取(适合操作小文件)
    fd.readline():每次读取一行内容
    fd.seek(0):调整文件读取的指针位置
    fd.seekable():判断文件是否可以调整指针位置(tty,磁盘等文件是不能被seek的),可以被seek则返回真,否则返回假 --Python3.x
    fd.tell():查询文件目前读取位置(以字符为单位)
    fd.truncate():截取文件,从开头开始截取,不指定指针位置的话,那么会清空文件
    fd.write:把一个字符串写入到文件中去
    fd.writelines():把字符串列表写入文件中
    fd.xreadlines():读一行打印一行,针对大文件非常适用 -----> Python 2.x 中适用,3.x中已经取消
    fd.encoding:查看文件的编码
    fd.writeable():判断文件是否可以写
    fd.fileno(): 返回文件在操作系统上的文件描述符(默认会打开三个:0表示 stdin、1表示 stdout,2表示stderr)
    fd.name:文件名称 

    练习

      for 循环遍历文件,打印文件的每一行
    #!/usr/bin/env python
    fd = open('/tmp/hello.txt')
    for line in fd:
    print line,
     
    注意:这里for line in fd,其实可以从fd.readlines()中读取,但是如果文件很大,那么就会一次性读取到内存中,非常占内存,而这里fd存储的是对象,只有我们读取一行,它才会把这行读取到内存中,建议使用这种方法。
     
      while循环遍历文件:
    #!/usr/bin/env python
    fd = open('/tmp/hello.txt')
    while True:
    line = fd.readline()
    if not line:
    break
    print line,
    fd.close()

    使用with

      如果不想每次打开文件都关闭,可以使用with关键字,2.6以上版本支持with读取 with open('/tmp/hello.txt') as fd: 然后所有打开文件的操作都需要缩进,包含在with下才,这样不需要明确的指定close,当新的代码没有缩进的时候,文件会自动关闭。
    with open('/tmp/hello.txt') as fd:
        while True:
            line = fd.readline()
                if not line:
                    break
                print line,
     
  • 相关阅读:
    【找回数学的感觉】1 再版汉诺塔等
    【算法】7 分不清栈和队列?一张图给你完整体会
    好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果
    我们应该怀念爱因斯坦的五个原因
    【万里征程——Windows App开发】如何在多个页面间读取/保存文件【草稿】
    仅仅是来自深夜的想法
    好玩的WPF第三弹:颤抖吧,地球!消失吧,地球!
    Markdown大赛二等奖
    让JavaScript在Visual Studio 2015中编辑得更容易
    好玩的WPF第二弹:电子表字体显示时间+多彩呼吸灯特效按钮
  • 原文地址:https://www.cnblogs.com/dachenzi/p/7718752.html
Copyright © 2020-2023  润新知