# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = ‘Administrator‘ #file与input output #文件对象 #简单说来,就是写入和读取的方式 #file(),open()2个操作都是一样的,一般推荐open() #语法 # open(name[, mode[, buffering]]) -> file object #file(name[, mode[, buffering]]) -> file object #mode默认为‘r‘(读取) """ mode=w写入 mode=r读取 mode=a追加 mode=rb二进制读取(音频,图片等) r+以读写模式打开 其他方法和这上面类似 """ #其中r和u是需要文件存在的,w如果文件存在,则先清空后重新写入,a是在打开的文件后面追加需要的内容 #+可读可写,b二进制 #buffering文件的缓存方式,其中0表示不缓冲,1表示缓冲一行,大于1表示给定值作为缓冲区大小,不提该参数或者给定负值表示默认,一般情况下默认即可 #打开文件的例子 """ f1=open(‘a‘),其中‘a‘表示文件名字,以默认读取方式 f2=open(‘a‘,‘w‘),其中‘a‘表示文件名字,以写入方式 #一般情况下这2个情况最常用 """ #工厂函数file() #与open()区别,一般处理文件使用file(),而写入读取文件使用open() #通用换行符支持(UNS) """ #这部分不需要知道,一般情况下使用默认即可 在2.3引入了uns,当你使用了‘u‘标志打开文件时,所有的行分隔符(或者结束符,无论它原来是什么)通过python输入方法(比如read*()) 都会被替换为换行符newline(\n),r‘u‘模式也支持‘rb‘项,还支持不同类型行结束符文件,对象newlines属性会记录它曾看到过的文件行结束符 如果文件刚刚被打开,程序还没遇到结束符,那么newlines为None,在第一行被读取后,它被设置为第一行结束符.如果遇到其它类型的行结束符, 文件的newlines 会成为一个 #包含每种格式的元组. 注意 UNS 只用于读取文本文件. 没有对应的处理文件输出的方法. #在编译 Python 的时候,UNS 默认是打开的. 如果你不需要这个特性, 在运行configure 脚本 #时,你可以使用 --without-universal-newlines 开关关闭它. 如果你非要自己处理行结束符, 请 #查阅核心笔记,使用 os 模块的相关属性. """ #文件内建方法重点:(read*(),write*()) #文件输入方法 """ 建议read()方法用来直接读取到字符串中,最多读取给定数目个字节,如果没有设置size参数(默认值为-1)或者size值为负,文件将被读取至末尾,未来可能删除这个参数 建议readline()方法读取打开文件一行(读取下个行结束符之前的所有字节),然后整行,包括行结束符,作为字符串返回,与read()相同,它也有一个size参数,默许为-1,代表读至结束符,如果提供该参数,那么在size字节后会返回不完整行 ###(特殊) readlines()[杀伤力大,占用太多内存]重点:它会读取所有(剩余的)行然后把它们作为一个字符串列表返回,可选参数sizhint代码返回的最大字节大小,如果大于0,那么返回所有行应该大约有sizhint字节 (可能稍微大于这个数字,因为需要凑齐缓冲区大小) 2.1加入一个新的对象用来高效迭代文件的行:xreadlines()(可以在xreadlines模块中找到),调用file.xreadlines()等于xreadlines.xreadlines(file),xreadlines() 并不是一次性读取完所有的行,而是每次读取一块,在for循环时可以减少内存使用 xreadlines()和iter(file)效果一样,直接使用for line in file:即可
""" #输出write*(),功能:包含文本数据或者二进制数据块字符串写入到文件中的 """ 与readlines()一样,writelines()方法也是针对列表操作,接受一个字符串列表作为参数,将它们写入文本中,行结束符并不会被自动加入,如果需要,就在结束前加结束符 注意:writelines()(列表)等价于使用以行结束符的结尾单行字符串调用write()方法 """ #使用列表解析进行读取/写入文件 #读取 f3=open(‘a1.txt‘,‘r‘) f3=[x.split() for x in f3.readlines()] print f3 f4=open(‘a3.txt‘,‘w‘) f4=open(‘a3.txt‘,‘r‘) #文件内移动 #方法seek(),可以在文件中移动到文件指针不同的位置 """ 参数offset字节代表相对于某个位置偏移量,位置默认为0,代表从0开始计算(即绝对偏移量),1表示当前位置算起,2表示结尾 0,1,2表示的是SEEK_SET,SEEK_CUR,SEEK_END. tell()方法是对seek()补充,会德庆你当前文件指针在文件位置--从文件起始算起,单位为字节 """ #文件迭代 #语法 """ for line in f: pass line代表文本文件的一行(包括末尾行结束符),可以使用它做任何想做的事情 在2.2之前,从文件中读取的方法是f.readlines()读取所有的数据,如果不是这样做,可以f.readline()每次读取一行,高效方法f.xreadlines() 2.2中,使用迭代和文件迭代,直接使用for line in f:即可实现,文件中还有一个方法file.next()可以读取文件的下一行,与其他的迭代器一样,当完成后触发异常StopIteration异常 当看见for i in f.readlines():时,可以安全删除对readlin()调用 #建议使用迭代方法,不管是新手,不需要关注过去方法 """ #其他 #close()当文件读取/写入完了,那么就要对它进行关闭,当如果你close()时,可能会让文件丢失 #fileno()打开文件描述符,返回整形,可以使用os.read()来处理 #flush()把缓冲区数据写入文件中(需要) #行分隔符与文件系统差异 #posix(unix系统或者mac os x平台)系统上,行分隔符换行符NEWLINE(\n)字符,在旧的macos下面RETURN(\r),在dos和wind32系统结合下使用(\r\n) #路径分隔符posix‘/‘,dos和windows‘\‘,旧版macos‘:,用来分隔文件路径:标记当前目录和父目录,python5个os模块中的属性可以帮助解决这个问题 #注意:我这边使用的是windows,其他系统请使用一样的方法,谢谢 print ‘os‘ import os #下面5个可以帮助在系统平台上面处理强大的功能 print os.linesep#给出当前平台使用的行终止符。例如,Windows使用‘\r\n‘,Linux使用‘\n‘而Mac使用‘\r‘。 print os.sep#可以取代操作系统特定的路径分割符 ,在win下面返回\ print os.pathsep#用于分隔文件路径字符串,在win下面返回; print os.curdir#使用的常量字符串引用当前的操作系统 目录中。 这是“.”Windows和P操作系统IX print os.pardir#操作系统使用的常量字符串引用父 目录中。 这是“. .”Windows和P操作系统IX #特别提醒: """ print语句默认在输出内容末尾后加一个换行符,而在语句后加一个逗号即可,readline()和readlines()函数不对行里面空白字符串做任何处理,所以有必须加逗号,如果省略逗号,显示出文本后会有2个换行符,其中一个输入是附带的,另一个是print自动添加的 truncate(),接受一个可选的size作为参数,如果给定,那么文件将被截取到最多size字节处,如果没有给定,那么默认截取文件当前任何 """ f=open(‘a3.txt‘,‘w+‘) print f.tell()#告诉你当前位置 f.write(‘test line \n‘) print f.tell() f.write(‘test line 2\n‘) print f.tell() f.seek(-12,1)#向后移动12个字节 print f.tell() print f.readline() f.seek(0,0) print f.readline() print f.tell() print f.readline() print f.tell() f.close() #文件对象方法 """ f.close()关闭文件1 f.fileno()文件描述符(f.descriptor,FD,整形值) f.flush()刷新文件内部缓冲区1 f.isatty()判断f是否是一个类tty设备 f.next()返回文件下一行(类似于f.readlines())或者在没有其他行时引发stopiteration异常1 f.read(size=-1)从文件读取size个字节,当未给定size或者给定负值时,读取剩余所有字节,然后作为字符串返回1 f.readinto(buf,size)从文件读取size个字节到buf缓冲器(不支持)1 f.readline(size=-1)从文件中读取并返回一行(包括行结束符),或者返回最大size个字符1 f.readlines(sizhint=0)读取文件并作为一个列表返回(包含所有的行结束符),如果给定sizhint且大于0,那么返回总和大约为sizhint字节的行(大小由缓冲器容量的下一个值决定(比如缓冲器大小只能为4K倍数,如果sizhint为15K,则最后返回的是16K) f.xreadlines()用于迭代,可以迭代readlines()高效方法 f.seek(off,whence=0)在文件中移动文件指针,从whence(0表示开始,1表示当前位置,2表示文件末尾 )偏移off字节 f.tell()返回当前文件中的位置1 f.truncate(size=f.tell())截取文件到最大size字节,默认为当前文件位置 f.write(str)向文件写入字符串1 f.writelines(seq)向文件写入字符串序列seq;se应该是一个返回字符串的可迭代对象,在2.2前,只是一个字符串列表1 """ #文件内建函数 """ file.name 返回文件名(包含路径) file.mode 返回文件打开模式 file.closed 返回文件是否已经关闭 file.encoding 返回文件的编码 file.newlines 未读取到行分隔符时为 None , 只有一种行分隔符时为一个字符串, 当 文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束 符的列表(非重点) file.softspace 为 0 表示在输出一数据后,要加上一个空格符,1 表示不加。这个属性 一般程序员用不着,由程序内部使用。(非重点) """ f=open(‘a2.txt‘,‘r‘) print f.readline() print f.newlines print f.softspace f.close() #标准文件 #输入stdin,输出stdout,错误stderr """ 文件对象对应翻译的标准输入、输出和错误 流。stdin用于所有翻译输入脚本但除外 包括调用输入()和raw_input()。 stdout用于 的输出打印和表达式语句和 提示的输入()和raw_input()。 解释器的提示 ,(几乎)所有的错误消息stderr。stdout和stderr不需要内置的文件对象:任何对象是可以接受的那么长 因为它有一个write()方法, 该方法接受一个字符串参数。 (改变这些 不会影响对象的标准I / O流流程执行os.popen(), 操作系统。system()或exec *()家庭的功能 的操作系统 """ #sys.*是处理好换行符,printj自动加入换行符 #命令行参数 #sys.argv对命令行参数访问,调用某个程序时除程序名以外的其他参数,argv变量代表从命令行上输入各个参数组成字符串数组 #在python中argc其实就是sys.argv列表的长度 ,而sys.argv[0]其实就是列表的第一项 #总结 """ sys.argv是命令行列表 len(sys.argv)命令行个数 """ #sys.argv例子 import sys print ‘you sys.argv:‘,len(sys.argv),‘len()‘ print str(sys.argv) print sys.argv[0] #另外还有2个模块来处理命令行模块,简单:getopt(最原始),复杂:optparse #os文件系统 """ 文件处理 mkfifo()/mknod() 创建命名管道/创建文件系统节点 可用性:Unix remove()/unlink() Delete file 删除文件1 rename()/renames() 重命名文件1 *stat () 返回文件信息1 symlink() 创建符号链接 可用性:Unix utime() 更新时间戳1 tmpfile() 创建并打开(‘w+b‘)一个新的临时文件 walk() 生成一个目录树下的所有文件名
目录/文件夹 chdir()/fchdir()a 改变当前工作目录/通过一个文件描述符改变当前工作目录 chroot() 改变当前进程的根目录 可用性: UNIX listdir() 列出指定目录的文件 getcwd()/getcwdu() 返回当前工作目录/功能相同, 但返回一个 Unicode 对象 mkdir()/makedirs() 创建目录/创建多层目录 rmdir()/removedirs() 删除目录/删除多层目录
访问/权限 access() 检验权限模式 chmod() 改变权限模式 chown()/lchown() 改变 owner 和 group ID/功能相同, 但不会跟踪链接 umask() 设置默认权限模式
文件描述符操作 open() 底层的操作系统 open (对于文件, 使用标准的内建 open() 函数) read()/write() 根据文件描述符读取/写入数据 dup()/dup2() 复制文件描述符号/功能相同, 但是是复制到另一个文件描述符
设备号 makedev() 从 major 和 minor 设备号创建一个原始设备号 major()/minor() 从原始设备号获得 major/minor 设备号
12. os.path 模块中的路径名访问函数 basename() 去掉目录路径, 返回文件名 1 dirname() 去掉文件名, 返回目录路径 1 join() 将分离的各部分组合成一个路径名 1 split() 返回 (dirname(), basename()) 元组 1 splitdrive() 返回 (drivename, pathname) 元组 1 splitext() 返回 (filename, extension) 元组 1
getatime() 返回最近访问时间 1 getctime() 返回文件创建时间 1 getmtime() 返回最近文件修改时间 1 getsize() 返回文件大小(以字节为单位) 1
查询 exists() 指定路径(文件或目录)是否存在 1 isabs() 指定路径是否为绝对路径 1 isdir() 指定路径是否存在且为一个目录1 isfile() 指定路径是否存在且为一个文件 1 islink() 指定路径是否存在且为一个符号链接1 ismount() 指定路径是否存在且为一个挂载点1 samefile() 两个路径名是否指向同个文件 1
""" #相关例子不在这写,请到网络上看相关例子 # os.path.expanduser(‘~/py‘)在Unix和Windows,返回参数的初始组件~或~用户取而代之的是,用户
13. 永久存储模块 大部分永久性储存模块是用来储存字符串数据的, 但是也有方法来归档 Python 对象. Python 提供了许多可以实现最小化永久性储存的模块. 其中的一组( marshal 和 pickle )可以用来转换并储存 Python 对象. 该过程将比基本类型复杂的对象转换为一个二进制数据集合,这样就可以把数据集合保存起来或通过网络发送, 然后再重新把数据集合恢复原来的对象格式.这个过程也被称为数据的扁平化, 数据的序列化, 或者数据的顺序化.
14. marshal 和 pickle 模块的区别在于 marshal 只能处理简单的 Python 对象(数字, 序列, 映射, 以及代码对象), 而pickle 还可以处理递归对象, 被不同地方多次引用的对象, 以及用户定义的类和实例. pickle 模块还有一个增强的版本叫 cPickle , 使用 C 实现了相关的功能.
15. shelve 模块使用 anydbm 模块寻找合适的 DBM 模块, 然后使用 cPickle 来完成对储存转换过程. shelve 模块允许对数据库文件进行并发的读访问, 但不允许共享读/写访问. 这也许是我们在 Python 标准库里找到的最接近于永久性储存的东西了.
python基础学习07(核心编程第二版)部分,布布扣,bubuko.com