[Python ] python中文件的

发布时间:2019-09-21 11:11:54编辑:auto阅读(1615)

    原文地址: http://blog.163.com/qimeizhen8808@126/ 这女孩写的挺好,有值得学习的地方。 

     1) 文件的打开和创建,关闭

     a)文件的打开和创建
    主要有两个open()和file()两个方法。它们的功能是提供了初始化输入/输出(I/O)通用接口.
     
    格式:file(name, mode [, buffering]] )
    name:文件名称,相对路径和绝对路径都可以。
    mode: 表示打开的模式,后面具体的介绍
    buffering: 表示访问文件所采用的缓冲方式,其中0表示不缓冲,1表示只缓冲一行数据,> 1表示缓冲区的大小
     
    mode模式:
    r  以读方式打开
    w  以写方式打开 (必要时清空, 没有则创建)
    a  以追加模式打开 (从 EOF 开始, 必要时创建新文件)
    r+ 以读写模式打开
    w+ 以读写模式打开
    a+ 以读写模式打开
    b  打开二进制的文件。可以与 r, w,a, + 结合使用
    U  支持所有的换行符号。 “ \r”, “\n”,“\r\n”
     
    总结: 
      1)使用 'r' 或 'U' 模式打开的文件必须是已经存在的
      2)使用 'w' 模式打开的文件若存在则首先清空, 然后(重新)创建
      3)以 'a' 模式打开的文件是为追加数据作准备的, 所有写入的数据都将追加到文件的末尾.
    举几个简单的示例:
    ---------r操作----------------------------------------------
    >>> p=file("/home/jane/a.t","r")
    >>> p.read()
    'hello\nhello world\nhello world hello world\n\n'
    >>> p.read(-1)  #这里可以看出read()每次打开文件后,只能读取一次
    ''
    >>> p.read(-1)
    'hello\nhello world\nhello world hello world\n\n' #这里对-1我不是很明白!文件将被读取直至末尾
    >>> p=file("/home/jane/a.t","r")
    >>> p.read(2)  #每次读取两个字节
    'he'
    >>> p=file("/home/jane/a.t","r")
    >>> p.read(1)  #每次读取一个字节
    'h'
    ---------r+操作--------
    >>> p=file("/home/jane/aa","r+")
    >>> p.write("good")
    >>> p.close()
    >>> 
    这里向aa文件中,写入并追加了good
    [jane@h3idan ~]$ tail -f aa
    goodabc
    aaaabbbbccc
    123456777888
    ---------w操作(清空文件)--------
    >>> p=file("/home/jane/aa","w")
    >>> p.write("good")
    >>> p.write("good")
    >>> p.close()
    这时监控中断,并且从新查看值的时候,文件被清空,同时写入了两个good
    [jane@h3idan ~]$ tail -f aa
    goodabc
    aaaabbbbccc
    123456777888
    tail: aa:文件已截断
    [jane@h3idan ~]$ tail -f aa
    goodgood
    ---------w+操作(清空文件)--------
    >>> p=file("/home/jane/aa","w+")
    >>> p.write("earth")
    >>> p.close()
    清空了文件,并写入了earth
    [jane@h3idan ~]$ tail -f aa
    goodgoodtail: aa:文件已截断
    ^C
    [jane@h3idan ~]$ tail -f aa
    earth
    ---------a+操作(清空文件)--------
    >>> p.close()
    >>> p=file("/home/jane/aa","a+")
    >>> p.write("good")
    >>> p.close()
    >>> p=file("/home/jane/aa","a+")
    >>> p.write("good")
    >>> p.close()
    >>> 
    写入并追加文件
    [jane@h3idan ~]$ tail -f aa
    earthgoodgood
     
    需要思考:
    w和w+的区别,w:写入并清空,w+读写并清空,这地方却没有明确看出运行时有什么区别!
    r+和a+的区别: 他们都是读取并写入,a+可以追加(末尾加),但是r+是加在最前面
     
    b)文件的关闭
    close :FileObject.close() 关闭打开的文件对象
     
    (2)文件的内建方法:
    文件方法可以分为四类: 输入, 输出, 文件内移动, 以及杂项操作。如下表--文件对象的内建方法: 
    file.close()--关闭文件
    file.fileno()--返回文件的描述符(file descriptor ,FD, 整数值)
    file.flush()--刷新文件的内部缓冲区
    file.isatty()--判断 file 是否是一个类 tty 设备
    file.next()--返回文件的下一行
    file.read(size=-1)---从文件读取 size 个字节, 当未给定 size 或给定负值的时候, 读取剩余的所有字节, 然后作为字符串返回
            上述定义不是很好理解,不如这个来的好:size: 读出文件的前 [size] 个字符 , 并输出给字符串,此时文件的指针指向 size 处
    file.readline(size=-1)---从文件中读取并返回一行(包括行结束符), 或返回最大 size个字符
    file.readlines(sizhint=0)--读取文件的所有行并作为一个列表返回(包含所有的行结束符);
    file.seek(off, whence=0)--在文件中移动文件指针, 从 whence ( 0 代表文件其始, 1 代表当前位置, 2 代表文件末尾)偏移 off 字节
    file.write(str)---向文件写入字符串
    file.writelines(seq)---向文件写入字符串序列 seq
     
    1)文件读取
    read() 方法用来直接读取字节到字符串中, 最多读取给定数目个字节. 如果没有给定 size参数(默认值为 -1)或者 size 值为负, 文件将被读取直至末尾.
    readline() 方法读取打开文件的一行(读取下个行结束符之前的所有字节). 然后整行,包括行结束符,作为字符串返回.
    readlines() 方法它会读取所有(剩余的)行,然后把它们作为一个字符串列表返回. 
    eg: 
    >>> p=file("/home/jane/a.t","r")
    >>> p.read()
    'hello\nhello world\nhello world hello world\n\n'
    >>> p=file("/home/jane/a.t","r")
    >>> p.readline()
    'hello\n'
    >>> p=file("/home/jane/a.t","r")
    >>> p.readlines()
    ['hello\n', 'hello world\n', 'hello world hello world\n', '\n']
    >>> 
    我的a.t文件内容为: 
    hello
    hello world
    hello world hello world
     
    2)文件写入
    write() 方法它把含有文本数据或二进制数据块的字符串写入到文件中去.
    writelines() 方法是针对列表的操作, 它接受一个字符串列表作为参数, 将它们写入文件. 行结束符并不会被自动加入, 所以如果需要的话, 你必须在调用writelines()前给每行结尾加上行
     
    结束符.
    eg: 
    -----write()------
    >>> p=file("/home/jane/aa","w+")
    >>> p.write("hello world")
    >>> p.close()
    >>> 
    这是aa文件的内容为:
    [jane@h3idan ~]$ tail -f aa
    hello world
    -----writelines()------
    >>> p=file("/home/jane/aa","w+")
    >>> p.writelines(["a","b","c","d"])
    >>> p.close()
    >>> 
    这时候aa文件内容为:
    [jane@h3idan ~]$ tail -f aa
    abcd
     
    3)内容查找和替换
    文件的查找和替换是和循环相关的,给出个题目:a)计算a.t中所有hello的数目,b)将所有的hello 替换成good
    a.t的文档内容为:
    [jane@h3idan ~]$ cat a.t 
    hello
    hello world
    hello world hello world
    【a解答】
    #!/usr/bin/python
    # n is hello number
    # i is hello number in eachline
    import re
    a=file("/home/jane/a.t","r")
    n=0
    for i in a.readlines():
            p=re.findall("hello",i)
            print p
            if len(p)>0:
                    n=n+len(p)
    print n
    a.close()
     或者
    #!/usr/bin/python
    import re
    a=file("/home/jane/a.t","r")
    n=0
    for i in a.readlines():
            str=r"hello"
            p=re.findall(str,i)
            print p
            if len(p)>0:
                    n=n+len(p)
    print n
    a.close()
     
    【b解答】
    #!/usb/bin/python
    import re
    a=file("/home/jane/a.t","r")
    b=file("/home/jane/a2.t","w")
    for i in a.readlines():
            b.write(i.replace("hello","good"))
    a.close()
    b.close()
     
    [jane@h3idan ~]$ cat a2.t 
    good
    good world
    good world good world
     
    4)其他 
    seek(off, whence=0) 方法可以在文件中移动文件指针到不同的位置
    next():FileObject.next()返回当前行,并将文件指针到下一行
     
    (3)目录操作
    对文件系统的访问大多通过 Python 的 os 模块实现. 该模块是 Python 访问操作系统功能的主要接口. os 模块实际上只是真正加载的模块的前端, 而真正的那个"模块"明显要依赖与具体的
     
    操作系统. 
    os的功能:对进程和进程运行环境进行管理,os 模块还负责处理大部分的文件系统操作, 应用程序。
    os.path的功能:可以完成一些针对路径名的操作. 它提供的函数可以完成管理和操作文件路径名中的各个部分, 获取文件或子目录信息, 文件路径查询等操作.对
    a)os对目录的操作:
    mkdir(path[,mode=0777])----创建目录
    makedirs(name, mode=511)-----创建多层目录, 
    rmdir(path)------删除目录
    removedirs(path)----删除多层目录
    listdir(path)----列出指定目录的文件
    getcwd() --- ---返回当前工作目录
    chdir(path)-----改变当前工作目录
    walk(top,topdown=True, onerror=None)---生成一个目录树下的所有文件名
    chroot()----改变当前进程的根目录
     
    示例:
    ****** ****mkdir()****************
    >>> import os
    >>> os.mkdir("/home/jane/qi",775)   
    >>> os.mkdir("/home/jane/qi2",0777)  #这里的mode=0777(默认mode),一开始没有太明白,后来突然想起,应该是umask的原因,linux中目录的默认umask是002,因此这里要是创建的具
     
    有缺省权限的目录(775),所以mode-=0777 不缺定理解是否正确!
    结果为:
    dr-----r-t. 2 jane jane 4096  8月 16 02:55 qi
    drwxrwxr-x. 2 jane jane 4096  8月 16 02:56 qi2
    *****makedirs()****************
    >>> os.makedirs("/home/jane/qi3/aa",511)    
    [jane@redhat aa]$ pwd
    /home/jane/qi3/aa
    [jane@redhat aa]$ ll -d
    drwxrwxr-x. 2 jane jane 4096  8月 16 03:15 .   # 可以看出被创建的目录也是具有775的权限的
    [jane@redhat aa]$
    help(makedirs)的帮助文档,显示是511这个我不是很明白?
    makedirs(name, mode=511)
        makedirs(path [, mode=0777])
    ********* 其他**********
    >>> os.rmdir("/home/jane/qi")
    >>> os.removedirs("/home/jane/qi3/aa")
    >>> os.listdir("/home/jane/qimeizhen")
    ['.test4.py.swp', '4.py', '.11.py.swp', 'test1.py', 'q.py', '1.py', '6.py', 'raw.py', '7.py', '5.py', 'for.py', '9.py', 'test2.py', 'test3.py', '3.py', '10.py', '2.py', 
     
    '8.py']
    >>> os.getcwd()
    '/home/jane'
    >>> os.chdir("/home/jane/qimeizhen")
    >>> os.getcwd()
    '/home/jane/qimeizhen'
       
    b)os对文件的操作
    remove()/unlink() --- 删除文件
    rename()/renames()---重命名文件
    **********rename()and remove***************
    >>> p=file("/home/jane/aa","w")
    >>> p.write("hello world")
    >>> p.close()
    >>> os.rename("/home/jane/aa","/home/jane/ab")
     
    c)os访问/权限
    access()----------检验权限模式
    chmod()-----------改变权限模式
    chown()/lchown()-----改变 owner 和 group ID/功能相同, 但不会跟踪链接
    umask()-------设置默认权限模式
     
    d)os文件描述符操作
    open()---底层的操作系统 open (对于文件, 使用标准的内建 open() 函数)
    read()/write()---根据文件描述符读取/写入数据
    dup()/dup2()----复制文件描述符号/功能相同, 但是是复制到另一个文件描述符设备号
    makedev()-----从 major 和 minor 设备号创建一个原始设备号
     
     
    e) 目录的遍历
    方法有三种:
        递归函数
        Os.path.walk() 函数
        Os.walk() 函数
     
    **************************递归函数遍历**************************************
    #!/usr/bin/python
    #encoding=utf-8
    #递归遍历目录(传统方法)
    import os
    def VisitDir(path):
        li=os.listdir(path)
        for p in li:
            pathname=os.path.join(path,p)
            if not os.path.isfile(pathname):
                VisitDir(pathname)
            else:
                print pathname
     
    if __name__=="__main__":
        path="/home/jane/qimeizhen"
        VisitDir(path)
    ~                                                                                 
    **************************os.path.walk()函数**************************************
    格式: walk(top, func, arg)
    ? 说明:
    ? top: 要遍历的目录树
    ? Func: 表示回调函数
    ? arg: 参数元组
    ------------------
    #!/usr/bin/python
    #encoding=utf-8
    #使用os.path.walk遍历
    import os, os.path
    def visitDir(arg, dirname, names):
            for filepath in names:
                    print os.path.join(dirname,filepath)
     
     
    if __name__ == "__main__":
            path = r"/home/jane/qimeizhen"
            os.path.walk(path, visitDir, ())
    *******************************Os.walk() 函数******************************************************
    格式: os.walk(top, topdown= True, onerror=None)
     top: 需要遍历的目录树路径
     topdown: =True 表示首先返回目录中的文件,然后在遍历子目录; =False 时,首先遍历目录的子目录,然后遍历目录文件,最后返回根目录文件
     Onerror=None: 是默认值,忽略遍历中出现的错误,否则更具自定义函数输出异常
     
    #!/usr/bin/python
    #encoding=utf-8
    #使用os.walk遍历
    import os
    def VisitDir(path):
            for root,dirs,files in os.walk(path):
                    for filespath in files:
                            print os.path.join(root,filespath)
     

关键字