• 技术文章 >后端开发 >Python教程

    Python 文件操作详解

    巴扎黑巴扎黑2017-09-21 10:52:16原创630
    这篇文章主要介绍了Python 文件操作的详解及实例的相关资料,希望通过本文大家能够理解掌握Python 文件操作的知识,需要的朋友可以参考下

    Python 文件操作的详解及实例

    一、文件操作

    1、对文件操作流程

    现有文件如下:


    昨夜寒蛩不住鸣。
    惊回千里梦,已三更。
    起来独自绕阶行。
    人悄悄,帘外月胧明。
    白首为功名,旧山松竹老,阻归程。
    欲将心事付瑶琴。
    知音少,弦断有谁听。
    
    f = open('小重山') #打开文件
    data=f.read()#获取文件内容
    f.close() #关闭文件

    注意:if in the win,hello文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要f=open(‘hello',encoding='utf8'),hello文件如果是gbk保存的,则直接打开即可。

    2、文件打开模式  

    Character Meaning


    'r'    open for reading (default)
    'w'    open for writing, truncating the file first
    'x'    create a new file and open it for writing
    'a'    open for writing, appending to the end of the file if it exists
    'b'    binary mode
    't'    text mode (default)
    '+'    open a disk file for updating (reading and writing)
    'U'    universal newline mode (deprecated)

    先介绍三种最基本的模式:


    # f = open('小重山2','w') #打开文件
    # f = open('小重山2','a') #打开文件
    # f.write('莫等闲1\n')
    # f.write('白了少年头2\n')
    # f.write('空悲切!3')

    3、文件具体操作


    f = open('小重山') #打开文件
    # data1=f.read()#获取文件内容
    # data2=f.read()#获取文件内容
    #
    # print(data1)
    # print('...',data2)
    # data=f.read(5)#获取文件内容
    
    # data=f.readline()
    # data=f.readline()
    # print(f.__iter__().__next__())
    # for i in range(5):
    #   print(f.readline())
    
    # data=f.readlines()
    
    # for line in f.readlines():
    #   print(line)
    
    
    # 问题来了:打印所有行,另外第3行后面加上:'end 3'
    # for index,line in enumerate(f.readlines()):
    #   if index==2:
    #     line=''.join([line.strip(),'end 3'])
    #   print(line.strip())
    
    #切记:以后我们一定都用下面这种
    # count=0
    # for line in f:
    #   if count==3:
    #     line=''.join([line.strip(),'end 3'])
    #   print(line.strip())
    #   count+=1
    
    # print(f.tell())
    # print(f.readline())
    # print(f.tell())#tell对于英文字符就是占一个,中文字符占三个,区分与read()的不同.
    # print(f.read(5))#一个中文占三个字符
    # print(f.tell())
    # f.seek(0)
    # print(f.read(6))#read后不管是中文字符还是英文字符,都统一算一个单位,read(6),此刻就读了6个中文字符
    
    #terminal上操作:
    f = open('小重山2','w')
    # f.write('hello \n')
    # f.flush()
    # f.write('world')
    
    # 应用:进度条
    # import time,sys
    # for i in range(30):
    #   sys.stdout.write("*")
    #   # sys.stdout.flush()
    #   time.sleep(0.1)
    
    # f = open('小重山2','w')
    # f.truncate()#全部截断
    # f.truncate(5)#全部截断
    
    # print(f.isatty())
    # print(f.seekable())
    # print(f.readable())
    
    f.close() #关闭文件

    接下来我们继续扩展文件模式:


    # f = open('小重山2','w') #打开文件
    # f = open('小重山2','a') #打开文件
    # f.write('莫等闲1\n')
    # f.write('白了少年头2\n')
    # f.write('空悲切!3')
    
    
    # f.close()
    
    #r+,w+模式
    # f = open('小重山2','r+') #以读写模式打开文件
    # print(f.read(5))#可读
    # f.write('hello')
    # print('------')
    # print(f.read())
    
    
    # f = open('小重山2','w+') #以写读模式打开文件
    # print(f.read(5))#什么都没有,因为先格式化了文本
    # f.write('hello alex')
    # print(f.read())#还是read不到
    # f.seek(0)
    # print(f.read())
    
    #w+与a+的区别在于是否在开始覆盖整个文件
    
    
    # ok,重点来了,我要给文本第三行后面加一行内容:'hello 岳飞!'
    # 有同学说,前面不是做过修改了吗? 大哥,刚才是修改内容后print,现在是对文件进行修改!!!
    # f = open('小重山2','r+') #以写读模式打开文件
    # f.readline()
    # f.readline()
    # f.readline()
    # print(f.tell())
    # f.write('hello 岳飞')
    # f.close()
    # 和想的不一样,不管事!那涉及到文件修改怎么办呢?
    
    # f_read = open('小重山','r') #以写读模式打开文件
    # f_write = open('小重山_back','w') #以写读模式打开文件
    
    # count=0
    # for line in f_read:
      # if count==3:
      #   f_write.write('hello,岳飞\n')
      #
      # else:
      #   f_write.write(line)
    
    
      # another way:
      # if count==3:
      #
      #   line='hello,岳飞2\n'
      # f_write.write(line)
      # count+=1
    
    # #二进制模式
    # f = open('小重山2','wb') #以二进制的形式读文件
    # # f = open('小重山2','wb') #以二进制的形式写文件
    # f.write('hello alvin!'.encode())#b'hello alvin!'就是一个二进制格式的数据,只是为了观看,没有显示成010101的形式

    注意1: 无论是py2还是py3,在r+模式下都可以等量字节替换,但没有任何意义的! 

    注意2:有同学在这里会用readlines得到内容列表,再通过索引对相应内容进行修改,最后将列表重新写会该文件。

    这种思路有一个很大的问题,数据若很大,你的内存会受不了的,而我们的方式则可以通过迭代器来优化这个过程。 

    补充:rb模式以及seek

    在py2中:


    #昨夜寒蛩不住鸣.
    
    f = open('test','r',) #以写读模式打开文件
    
    f.read(3)
    
    # f.seek(3)
    # print f.read(3) # 夜
    
    # f.seek(3,1)
    # print f.read(3) # 寒
    
    # f.seek(-4,2)
    # print f.read(3) # 鸣

    在py3中:


    # test: 
    昨夜寒蛩不住鸣.
    
    f = open('test','rb',) #以写读模式打开文件
    
    f.read(3)
    
    # f.seek(3)
    # print(f.read(3)) # b'\xe5\xa4\x9c'
    
    # f.seek(3,1)
    # print(f.read(3)) # b'\xe5\xaf\x92'
    
    # f.seek(-4,2)
    # print(f.read(3))  # b'\xe9\xb8\xa3'
    
    #总结: 在py3中,如果你想要字符数据,即用于观看的,则用r模式,这样我f.read到的数据是一个经过decode的
    #   unicode数据; 但是如果这个数据我并不需要看,而只是用于传输,比如文件上传,那么我并不需要decode
    #   直接传送bytes就好了,所以这个时候用rb模式.
    
    #   在py3中,有一条严格的线区分着bytes和unicode,比如seek的用法,在py2和py3里都是一个个字节的seek,
    #   但在py3里你就必须声明好了f的类型是rb,不允许再模糊.
    
    #建议: 以后再读写文件的时候直接用rb模式,需要decode的时候仔显示地去解码.

    4、with语句

    为了避免打开文件后忘记关闭,可以通过管理上下文,即:


    with open('log','r') as f:
        pass

    如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

    在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:


    with open('log1') as obj1, open('log2') as obj2:
      pass2

    以上就是Python 文件操作详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Python 详解 文件
    上一篇:python中列表、字符串、字典常用操作总结 下一篇:python Socket之客户端和服务端握手详细介绍
    PHP编程就业班

    相关文章推荐

    • 实例详解python之requests模块• 实例详解Python元组• python列表和元组详解(实例详解)• 经典技巧之Python案例详解• 归纳整理三十个Python的实用技巧

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网