[PYTHON] 核心编程笔记之九-Py

发布时间:2019-09-14 09:22:47编辑:auto阅读(1555)

    9.2 文件内建函数[open()和file()]


    内建函数open()[以及file()]提供了初始化输入/输出(I/0)操作的通用接口,open()内建函数成功打开文件后会返回一个文件对象,否则引发一个错误,当操作失败,Python会产生一个IOError异常


    file_object = open(file_name,access_mode='r',buffering=-1)


    file_name是打开文件名字的字符串

    access_mode代表文件打开的模式, r代表读取,w代表写入,a代表追加,U代表通用换行符支持


    例:

    fp = open("/etc/motd") #以读方式打开

    fp = open('test','w') # 以写方式打开

    fp = open('data','r+') #以读写方式打开

    fp = open(r'c:\io.sys','rb') # 以二进制读模式打开


    9.2.1 工厂函数file()

    例如: dict(),bool(),file()等等


    9.2.2 通用换行符支持(UNS)


    9.3 文件内建方法


    9.3.1 输入


    read()方法用来直接读取字节到字符串中,最多读取给定数目个字节


    readline()方法读取打开文件的一行,然后整行,包括字符结束行,作为字符串返回


    readlines()方法会读取所有剩余行然后把他们作为一个字符串列表返回.


    9.3.2 输出

    write()内建方法功能与read()和readline()相反,它把含有文本数据或二进制数据块的字符串写入到文件中


    9.3.3 文件内移动

    seek()方法可以在文件中移动文件指针到不同位置,offset字节代表相对于某个位置偏移量,位置的默认值为0, 1代表从当前位置算起,2代表从文件末尾算起


    text()方法是对seek()的补充:它告诉你当前文件指针在文件中的位置


    9.3.4 文件迭代

    for eachLine in f.readline():


    9.3.5 其它

    close()通过关闭文件来结束对它的访问

    调用flush()方法会直接把内部缓冲区的数据立刻写入文件,而不是被动等待

    isatty(),当文件是一个类tty设备时返回True,否则false


    9.3.6 文件方法杂项:

    filename = raw_input('Enter file name: ')

    f = open(filename, 'r')

    allLines = f.readlines()

    f.close()

    for eachLine in allLines:

       print eachLine,


    使用文件迭代器,每次只读取和显示一行:

    filename = raw_input('Enter file name: ')

    f = open(filename, 'r')

    for eachLIne in f:

       print eachLine,

    f.close()


    注:行分隔符和其他文件系统的差异

    POSIX(Unix系列或Mac OS X)系统上,行分隔符是 换行符 NEWLINE(\n)字符

    旧的MacOS下是RETURN(\r)

    DOS和WIN32系统下结合使用 \r\n


    有助于跨平台开发的os模块属性

    os模块属性描述

    linesep用来在文件中分隔行的字符串

    sep用来分隔文件路径名的字符串

    pathsep用来分隔文件路径的字符串

    curdir当前工作目录的字符串名称

    pardir父目录字符串名称


    只要导入os模块,这些变量会设定成自动的值

    ---------------------------------------

    #!/usr/bin/env python

    import os

    filename = raw_input('Enter file name: ')

    fobj = open(filename,'w')

    while True:

       aLine = raw_input("Enter a line ('.' to quit): ")

       if aLine != ".":

           fobj.write('%s%s' %(aLine, os.linesep))

       else:

           break

    fobj.close()

    ----------------------------------------


    以可读可写模式创建一个新文件,使用seek()方法在文件内部移动,使用tell()方法展示我们移动的过程

    >>> f = open('/tmp/x','w+')

    >>> f.tell()

    0L

    >>> f.write('test line 1\n') # 加入一个长度为12的字符串[0-11]

    >>> f.tell()

    12L

    >>> f.write('test line 2\n') # 加入一个长度为12的字符串[12-23]

    >>> f.tell()

    24L

    >>> f.seek(-12,1) # 向后移12个字节

    >>> f.tell()# 到了第二个的开头

    12L

    >>> f.readline()

    'test line 2\n'

    >>> f.seek(0,0)  # 回到最开始

    >>> f.readline()

    'test line 1\n'

    >>> f.tell()    # 又回到了第二行

    12L

    >>> f.readline()

    'test line 2\n'

    >>> f.tell()    # 又到了结尾

    24L

    >>> f.close()   # 关闭文件


    文件对象的内建方法列表


    文件对象的方法操作

    file.close()关闭文件

    file.fileno()返回文件的描述符

    file.flush()刷新文件的内部缓冲区

    file.isatty()贩毒案file是否是一个类tty设备

    file.next()返回文件的下一行

    file.read(size=-1)从文件读取size个字节,当未给定size或给定负值的时候,读取所有字节,作为字符串返回

    file.readinto(buf,size)从文件读取size个字节到buf缓冲区(已不支持)

    file.readline(size=-1)从文件中读取并返回一行(包括行结束符),或返回最大size个字符

    file.readlines(sizeint=0)读取文件的所有行并作为一个列表返回(包含所有行的结束符)

    file.xreadlines()用于迭代,可以替换readlines()的一个更高效方法

    file.seek(off,whence=0)在文件中移动文件指针,从whence(0代表文件起始,1代表当前位置,2代表文件末尾)偏移off字节

    file.tell()返回当前在文件中的位置

    file.truncate(size=file.tell()) 截取文件到最大size字节,默认为当前文件位置

    file.write(str)向文件写入字符串

    file.writelines(seq)向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象


    9.4 文件内建属性


    文件对象的属性描述

    file.closedTrue表示文件已经被关闭,否则为False

    file.encoding文件所使用的编码

    file.mode文件打开时使用的访问模式

    file.name文件名

    file.newlines未读取到行分隔符时为None

    file.softspace为0表示在输出一数据后,要加上一个空格符,1表示不加

    9.5 标准文件

    只要你的程序一执行,那么你就可以访问三个标准文件,标准输入stdin,标准输出stdout,和标准错误stderr.

    Python中可以通过sys模块来访问这些文件的句柄

    print语句通常输出到sys.stdout

    raw_input()通常从sys.stdin接受输入

    sys.* 是文件,所以你必须自己处理好换行符


    9.6 命令行参数

    sys模块通过sys.argv属性提供对命令行参数的访问

    总结如下:

    sys.argv是命令行参数的列表

    len(sys.argv)是命令行参数的个数(也就是argc)

    例:

    -------------------------

    #!/usr/bin/env python

    import sys


    print 'you entered', len(sys.argv),'arguments..'

    print 'they ware:', str(sys.argv)

    -------------------------

    # ./argv.py 76 tales 85 hawk

    you entered 5 arguments..

    they ware: ['./argv.py', '76', 'tales', '85', 'hawk']


    9.7 文件系统


    os模块的文件/目录访问函数

    函数描述

    文件处理

    mkfifo()/mknod()创建命名管道/创建文件系统节点

    remove()/unlink()Delete file 删除文件

    rename()/renames()重命名文件

    stat()返回文件信息

    symlink()创建符号链接

    utime()更新时间戳

    tmpfile()创建并打开(w+b)一个新的临时文件

    walk()生成一个目录树下的所有文件名


    目录/文件夹

    chdir()/fchdir()改变当前工作目录/通过一个文件描述符改变当前工作目录

    chroot()改变当前进程的根目录

    listdir()列出指定目录的文件

    getcwd()/getcwdu()返回当前工作目录/功能相同,但返回一个Unicode对

    mkdir()/makedirs()创建目录/创建多层目录

    rmdir()/removedirs()删除目录/删除多层目录

    os.pardir返回当前目录的父目录


    文件描述符操作

    open()底层操作系统open(对于文件,使用标准的内建open()函数)

    read()/write()根据文件描述符读取/写入数据

    dup/dup2()复制文件描述符号/功能相同,但是是复制到另一个文件描述符


    设备号

    makedev()从major和minor设备号创建一个原始设备号

    major()/minor()从原始设备号获得major/mino设备号


    os.path模块中的路径名访问函数

    函数描述

    分隔

    basename()去掉目录路径,返回文件名

    dirname()去掉文件名,返回目录路径

    join()将分隔的各部分组成很成一个路径名

    split()返回(dirname(),basename())元组

    splitdrive()返回(drivename(),pathname)元组

    splitext()返回(filename,extension)元组


    信息

    getatime()返回最近访问时间

    getctime()返回文件创建时间

    getmtime()返回最近文件修改时间

    getsize()返回文件大小(以字节为单位)


    查询

    exists()指定路径(文件或目录)是否存在

    isabs()指定路径是否为绝对路径

    isdir()指定路径是否存在且为一个目录

    isfile()指定路径是否存在且为一个文件

    islink()指定路径是否存在且为一个符号链接

    ismount()指定路径是否存在且为一个挂载点

    samefile()两个路径名是否指向同个文件


    例: os和os.path模块例子

    ---------------------------------------

    #!/usr/bin/env python


    import os


    notmp = 0

    for tmpdir in('/tmp',r'c:\temp'):

       if os.path.isdir(tmpdir):

           print '%s is a directory' %tmpdir

           break

       else:

           notmp += 1

    if notmp != 0:

       print 'no temp directory available'


    if tmpdir:

       os.chdir(tmpdir)

    cwd = os.getcwd()

    print '*** current temporary directory'

    print cwd


    print '*** creating example directory...'

    if not os.path.exists('example'):

       os.mkdir('example')

    os.chdir('example')

    cwd = os.getcwd()

    print '*** new working directory: '

    print cwd


    print '*** original directory listing: '

    print os.listdir(cwd)


    print '*** creating test file...'

    fobj = open('test','w')

    fobj.write('foo\n')

    fobj.write('bar\n')

    fobj = open('test')

    for line in fobj:

       print line,

    fobj.close()


    print '*** updated directory listing: '

    print os.listdir(cwd)


    print "*** renaming 'test' to 'filetest.txt'"

    os.rename('test','filetest.txt')

    print '*** updated directory listing: '

    print os.listdir(cwd)


    path = os.path.join(cwd,os.listdir(cwd)[0])

    print '*** full file pathname'

    print path

    print '*** (pathname,basename) =='

    print os.path.split(path)


    print '*** displaying file contents: '

    fobj = open(path)

    for eachLine in fobj:

      print eachLine,

    fobj.close()


    print '*** deleting test file'

    os.remove(path)

    print '*** updated directory listing: '

    print os.listdir(cwd)

    # means cd ..

    os.chdir(os.pardir)

    print '*** deleting test directory'

    os.rmdir('example')

    print '*** DONE'

    ------------------------------


    # python test28.py

    ----------------------------------

    /tmp is a directory

    *** current temporary directory

    /tmp

    *** creating example directory...

    *** new working directory:

    /tmp/example

    *** original directory listing:

    []

    *** creating test file...

    foo

    bar

    *** updated directory listing:

    ['test']

    *** renaming 'test' to 'filetest.txt'

    *** updated directory listing:

    ['filetest.txt']

    *** full file pathname

    /tmp/example/filetest.txt

    *** (pathname,basename) ==

    ('/tmp/example', 'filetest.txt')

    *** displaying file contents:

    foo

    bar

    *** deleting test file

    *** updated directory listing:

    []

    *** deleting test directory

    *** DONE

    ------------------------------------


    核心模块: os和os.path


    9.8 文件执行

    9.9 永久存储模块

    9.9.1 pickle和marshal模块

    9.9.2 DBM风格的模块

    9.9.3 shelve模块


    9.10 相关模块


    文件相关模块

    模块内容

    base64提供二进制字符串和文本字符串的编码/解码操作

    binascii提供二进制和ASCII编码的二进制字符串间的编码/解码操作

    bz2访问BZ2格式的压缩文件

    csv访问csv文件

    filecmp用于比较目录和文件

    fileinput提供多个文本文件的行迭代器

    getopt/optparse提供命令行参数的解析/处理

    glob/fnmatch提供Unix样式的通配符匹配功能

    gzip/glib读写GNU zip(gzip)文件(压缩需要zlib模块)

    shutil提供高级文件访问功能

    c/String10对字符串对象提供类文件接口

    tarfile读写TAR归档文件,支持压缩文件

    tempfile创建一个临时文件(名)

    uu格式的编码和解码

    zipfile用于读取ZIP归档文件的工作


    fileinput模块遍历一组输入文件,每次读取它们内容的一行


    glob和fnmatch模块提供老师Unix shell样式文件名的模式匹配,例如使用*通配符代表任意字符串,用问好(?)匹配任意单个字符


    核心提示:使用os.path.expanduser()的波浪号(~)进行扩展

    Unix:

    >>> import os

    >>> os.path.expanduser('~/example')

    '/root/example'

    WIN32:

    >>> import os

    >>> os.path.expanduser('~/example')

    'C:\\Documents and Settings\\example'



关键字