• Python之文件操作:文件的读写


    一、open函数:对文件读写之前,需要先打开文件,获取文件句柄
    注意:open() file() 尽量使用open(),Python3以后不支持file()了
    1、open(file_name[,access_mode][,buffering])
    (1)参数说明
    file_name:一个包含了你要访问的文件路径及文件名称的字符串值。尽量使用绝对路径
    access_mode:打开文件的方式:这个参数是非强制的,默认文件访问模式为只读(r)
    r,只读
    w:写之前会清空文件的内容
    a:追加的方式,在原本内容中继续写
    buffering:先写到缓存中
    如果buffering的值被设置为0,就不会有寄存;如果值为1,访问文件时会缓存行;如果值位大于1的整数,表明了这就是寄存区的缓冲大小;如果取负值,寄存区的缓冲大小则为系统默认。该参数也是非强制性的。
    (2)返回值
    该语句表示返回的File_object是一个指向文件的指针(一个文件对象)文件句柄。当以只读模式(r)打开一个不存在的文件时,就会报IOError异常(文件不存在),但如果是以写或追加模式(w/a/a+)打开一个不存在的文件时,默认会创建该文件,但如果是所在路径中有目录不存在,也会报IOError异常
     
    创建一个文件:
    fp=open('d:\tmp\01.txt',w)
     
    2、mode文件操作模式
    r,w,a
    r+可读可写
    w+:打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
     
    rb wb ab 读写二进制
     
    3、通过open获取到的文件句柄可以对文件作的其他操作
    (1)fp.closed
    判断文件是否已经关闭。返回true如果文件已被关闭,否则返回false
    (2)fp.mode
    输出读写模式。返回被打开文件的访问模式。
    (3)fp.name:
    返回文件的名称。
    (4) fp.softspace
    如果用print输出后,是否跟一个空格符,false不打印,true则打印。
    (5)fp.close()
    刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
    (6)flush()
    把缓冲区中的内容持久化写到磁盘里
    缓存区写满的情况,系统会自动调用flush()方法。
    调用flush的时机:写入了多少长度的数据,或者间隔了多长的时间
    如果没有flush(),持久化内容丢失
    (7)next()
    # for i in fp:
    # print i
    把一个file用for...in file这样的循环遍历语句时,就是调用next()函数来实现。
    文件句柄是一个迭代器???
     
    fp=open(fileName,'r')
     
    print fp.next()
    print fp.next()
    print fp.fileno() 判断当前操作的文件句柄是哪一个number
    fp.close()
     
    (8)裁剪文件truncate([size])
    用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断之后 size 后面的所有字符被删除。
    如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
    fp='e:\tmp\03.txt'
     
    f1=open(fp,'r+')
    line=f1.readline()
    print line
     
    f1.truncate()
    print f1.tell()
    f1.close()
     
    二、对文件作读写操作
    1、常规的读写操作
    (1)read([size])
    size:读取的长度,以byte为单位。如果不指定参数,表示一次性读取全部内容,以字符串形式返回,并且每一行结尾会有一个" "符号。
     
    (2)、readline([size])
    调一次读取一行,如果给定了size,有可能返回的只是一行的一部分,以字符串的形式返回,并且结尾会有一个换行符" "。读完一行,文件操作标记移动到下一行的开头。
    返回的是字符串
     
    (3)、readlines([size])
    (3.1)参数
    size:指定很小的数字,会不生效,python 默认8k缓存区大小,需要大于8k生效
    读取文件的全部内容,这个函数的内部是通过循环调用readline()来实现的
    (3.2)返回值
    返回的是列表格式,每一行是列表的一个元素,并且结尾会有一个换行符" "
     
    (4)、writelines(seq)
    seq:把seq(序列)的内容全部写到文件中(多行一次性写入)。也不会自动加入换行符。
    注意:序列中的内容也必须是字符串类型的数据,才能成功写入文件。
     
    (5)、write(str)
    把str写到文件中,默认是不加换行符的,所以如果想换行的话,得手动加入换行符' '。
     
    2、使用linecache模块读取文件
    import linecache
    允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行。
    (1)linecache.getlines(filename,lineno)
    从名为 filename 的文件中得到第 lineno 行。
    这个函数从不会抛出一个异常–产生错误时它将返回”(换行符将包含在找到的行里)。
    如果文件没有找到,这个函数将会在 sys.path 搜索。
    (2)linecache.getlines(filename) 返回列表
    从名为 filename 的文件中得到全部内容,输出为列表格式,以文件每行为列表中的一个元素,并以 linenum-1 为元素在列表中的位置存储
    (3)linecache.clearcache()
    清除缓存,如果你不再需要先前从 getline() 中得到的行
    (4)linecache.checkcache([filename])
    检查缓存的有效性。如果在缓存中的文件在硬盘上发生了变化,并且你需要更新版本,使用这个函数。
    如果省略 filename,将检查缓存里的所有条目。
    (5)linecache.updatecache(filename)
    更新文件名为 filename 的缓存。如果 filename 文件更新了,使用这个函数可以更新
    linecache.getlines(filename)返回的列表。
     
    另:读取文件之后你不需要使用文件的缓存时需要在最后清理一下缓存,使linecache.clearcache()清理缓存,释放缓存。
    这个模块是使用内存来缓存你的文件内容,所以需要耗费内存,打开文件的大小和打开速度和你的内存大小有关系。
    打印奇数行的文件:
    fp='e:\tmp\05.txt'
    list1=linecache.getlines(fp)
    for i in list1[::2]:
    print i
     
    3、pickle模块和cPickle模块
    对文件整体的读写
    (1)、pickle模块(Python提供一个标准的模块)
    列表内容持久存储到内存中
    使用它你可以在一个文件中储存任何Python对象,之后你又可以把它完整无缺地取出来。这被称为持
    久地储存对象(序列化)
    (2)、cPickle 列表和文件内容的转换
    它的功能和pickle模块完全相同,只不过它是用C语言编写的,因此要快得多(比pickle快1000倍),推荐使用。
    import cPickle as p
    p.dump(list,fp) 把列表list内容保存到内存中,存入一个文件(这个文件带有cPickle特有的格式)中
    fp:打开的文件句柄,如:fp=open('d:\tmp\test1.txt','wb')
    list=p.load(fp) 把之前存放在文件中的内容保存到列表list中
     
     
    三、读取文件的位置定位
    1、tell()
    返回当前操作文件读取到的位置
    一个中文:3个字节
    Windows下‘ ’(换行符)占两个字节,Linux下 mac下 .
    2、seek(offset[,from]) 移动游标到想去的位置
    from:,默认是0,2:从末尾开始计算偏移;1:从当前位置作为标准位置
    offset:移动的总距离,可以是正数,可以为负数
     
  • 相关阅读:
    oracle中pro*c的学习
    影响因子最大的国外计算机科学期刊50种
    eclipse3.6安装subversive插件
    WebLogic、WebSphere、JBOSS、Tomcat之间的区别
    hibernate.hbm.xml详解
    DotSpatial
    FLARtoolkit技巧:使用彩色marker
    全新体验 腾讯正式发布Sliverlight QQ
    ARToolKit技术视频欣赏
    写给未来的妻子你
  • 原文地址:https://www.cnblogs.com/emily-qin/p/7001053.html
Copyright © 2020-2023  润新知