python核心编程第二版第九章学习笔记

一.文件对象
    内建函数 open() 返回一个文件对象(参见下一小节), 对该文件进行后继相关的操作都要用到 它. 还有大量的函数也会返回文件对象或是类文件( file函数 )对象. 进行这种抽象处理的主要原 因是许多的输入/输出数据结构更趋向于使用通用的接口. 这样就可以在程序行为和实现上保持一 致性.
二.文件内建函数[open()和file()]
1.内建函数 open() 的基本语法是:
file_object = open(file_name, access_mode='r', buffering=-1)

可选参数 buffering 用于指示访问文件所采用的缓冲方式. 其中 0 表示不缓冲, 1 表示只缓冲一行数据, 任何其它大于 1 的值代表使用给定值作为缓冲区大小. 不提供该参数或者 给定负值代表使用系统默认缓冲机制。
2.文件对象的访问模式
文件模式        操作
r               以读方式打开
rU 或 Ua        以读方式打开, 同时提供通用换行符支持 (PEP 278)
w               以写方式打开 (必要时清空)
a               以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+              以读写模式打开
w+              以读写模式打开 (参见 w )
a+              以读写模式打开 (参见 a )
rb              以二进制读模式打开
wb              以二进制写模式打开 (参见 w )
ab              以二进制追加模式打开 (参见 a )
rb+             以二进制读写模式打开 (参见 r+ )
wb+             以二进制读写模式打开 (参见 w+ )
ab+             以二进制读写模式打开 (参见 a+ )
3.工厂函数file()
open() 和 file() 函数具有相同的功能, 可以任意替换. 您所看到任何使用 open() 的地方, 都可以使用 file() 替换它.
三.文件内建方法
1.输入
(1)read()方法
用来直接读取字节到字符串中, 最多读取给定数目个字节. 如果没有给定 size 参数(默认值为 -1)或者 size 值为负, 文件将被读取直至末尾.
(2)readline()方法
读取打开文件的一行(读取下个行结束符之前的所有字节). 然后整行,包括行 结束符, 作为字符串返回
(3)readlines()方法
并不像其它两个输入方法一样返回一个字符串. 它会读取所有(剩余的)行然 后把它们 作为一个字符串列表返回 .
2.输出
(1)writelines () 方法
    它接受一个字符串列表作为参 , 将它们写入文件.  行结束符并不会被自动加入,  所以如果需要的话,  你必须在调用 writelines()前给每行结尾加上行结束符.
(2)write()方法
write( )函数的参数是一个字符串,分以下2种情况:
1》通过write()函数向文件中写入一行
>>> f=open(r"C:\Users\Administrator\Desktop\test.txt",'w')
>>> f.write('hello,world!\n')#写入的字符串仅仅在末尾包含一个换行符。
>>> f.close()
运行程序,结果如下:

2》通过write()函数向文件中写入多行
>>> f=open(r"C:\Users\Administrator\Desktop\test.txt",'w')
>>> f.write('hello python!\nhello world!\n')#写入的字符串包含多个换行符,可以达到写入多行的效果
>>> f.close()
运行程序,结果如下:
3.核心笔记:保留行分隔符
当使用输入方法如 read() 或者 readlines() 从文件中读取行时, Python 并不会删除行结束 符. 这个操作被留给了程序员. 例如这样的代码在 Python 程序中很常见:
f = open('myFile', 'r')
data = [line.strip() for line in f.readlines()]
f.close()
类似地, 输出方法 write() 或 writelines() 也不会自动加入行结束符. 你应该在向文件写 入数据前自己完成。
四.文件内移动
1.seek函数
  1. file.seek(off, whence=0):从文件中移动off个操作标记(文件指针),正往结束方向移动,负往开始方向移动。如果设定了whence参数,就以whence设定的起始位为准,0代表从头开始,1代表当前位置,2代表文件最末尾位置。  
2.tell函数
格式: tell( )     返回文件指向位置的索引
五.核心笔记: 行分隔符和其它文件系统的差异
    操作系统间的差异之一是它们所支持的行分隔符不同. 在 POSIX (Unix 系列或 Mac OS X)系统 上, 行分隔符是 换行符 NEWLINE ( \n ) 字符 在旧的 MacOS 下是 RETURN ( \r )  , 而  DOS 和 Wind32 系统下结合使用了两者 ( \r\n ). 检查一下你所使用的操作系统用什么行分隔符。 另个不同是路径分隔符(POSIX 使用 "/", DOS 和 Windows 使用 "\", 旧版本的 MacOS 使用 ":"), 它用来分隔文件路径名, 标记当前目录和父目录.

有助于跨平台开发的 os 模块属性
os 模块属性           描述
linesep               用于在文件中分隔行的字符串
sep                   用来分隔文件路径名的字符串
pathsep               用于分隔文件路径的字符串
curdir                当前工作目录的字符串名称
pardir                (当前工作目录的)父目录字符串名称
六.文件内建属性
文件对象的属性           描述
file.closed             True表示文件已经被关闭, 否则为 False
file.encoding              文件所使用的编码 - 当 Unicode 字符串被写入数据时, 它们将自动使 用 file.encoding 转换字节字符串;若file.encoding 为 None 时使 用系统默认编码
file.mode                文件打开时使用的访问模式
file.name                文件名
file.newlines            未读取到行分隔符时为 None , 只有一种行分隔符时为一个字符串, 当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束符的列表
标准文件
    stdin , stdout 和 stderr . 我们说"只要你的程序一执行就可以访问这三个标准文件", 意思是这 些文件已经被预先打开了, 只要知道它们的文件句柄就可以随时访问这些文件. Python 中可以通过 sys 模块来访问这些文件的句柄. 导入 sys 模块以后, 就可以使用 sys.stdin , sys.stdout 和 sys.stderr 访问. print 语句通常是输出到 sys.stdout ; 而内建 raw_input() 则通常从 sys.stdin 接受输入. 记得 sys.* 是文件, 所以你必须自己处理好换行符. 而 print 语句会自动在要输出的字符串 后加上换行符。
八.命令行参数
    sys 模块通过 sys.argv 属性提供了对命令行参数的访问。 命令行参数是调用某个程序时除程 序名以外的其它参数. 这样命名是有历史原因的, 在一个基于文本的环境里(比如 UNIX 操作系统 的 shell 环境或者 DOS-shell ), 这些参数和程序的文件名一同被输入的. 但在 IDE 或者 GUI 环 境中可能就不会是这样了, 大多 IDE 环境都提供一个用来输入"命令行参数"的窗口; 这些参数最 后会像命令行上执行那样被传递给程序.
总结如下:
��   sys.argv 是命令行参数的列表
��   len(sys.argv) 是命令行参数的个数
九.核心模块: os (和 os.path )
从上面这些长篇讨论可以看出, os 和 os.path 模块提供了访问计算机文件系统的不同方法. 我们在本章学习的只是文件访问方面, 事实上 os 模块可以完成更多工作. 我们可以通过它管理进 程环境, 甚至可以让一个 Python 程序直接与另外一个执行中的程序"对话". 你很快就会发现自己 离不开这个模块了.
os 模块文件与目录操作
代码
import   os
for   tmpdir   in   ( '/tmp' , r'f:\temp' ): # 代表两个路径

    if   os.path.isdir(tmpdir):                            #此目录是否存在
        break
    else :
        print ( 'no temp directory available' )
    tmpdir= ''
if   tmpdir:
    os.chdir(tmpdir) # 改变目录
    cwd=os.getcwd() # 得到当前目录
    print ( '***current temprary directory' )
    print (cwd) # 打印当前目录
    print ( '*** creating example directory' )
    os.mkdir( 'example' ) # 新建单层目录
    os.chdir( 'example' ) # 改变当前工作目录
    cwd=os.getcwd() # 得到当前目录
    print ( '***new working directory:' )
    print (cwd) # 打印当前目录
    print ( '***original directory:' )
    print (os.listdir(cwd)) # 打印当前目录的文件列表
    print ( '***create text file' )
    fobj= open ( 'test' , 'w' ) # 新建文件
    fobj.write( 'foo \n ' )
    fobj.write( 'bar \n ' )
    fobj.close()
    print ( '***updated directory listing:' )
    print (os.listdir(cwd)) # 打印当前目录文件
    print ( "renaming 'test' to 'filetest.txt'" )
    os.rename( 'test' , 'filetest.txt' ) # 重新给文件命名( oldname newname
    print ( '***updateed 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 ( '***(filename,extension)==' )
    print (os.path.splitext(os.path.basename(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))
    os.chdir(os.pardir)
    print ( '*** deleting test listing' )
    os.rmdir( 'example' ) # 删除单层目录,如该目录非空则抛出异常
    print ( '***DONE' )





©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页