zoukankan      html  css  js  c++  java
  • python学习笔记day08 文件操作

    文件操作

    想要打开一个文件需要:

    1.文件所在位置:绝对路径;

    2.文件编码方式:utf-8,gbk...;

    3.打开文件的方式:只读,只写,追加,读写,写读;

    file=open("F:\workspace_python\pycharm_projects\fullstack2018-08-17\week2\day01\xixi.txt",mode='r',encoding='utf-8')
    content=file.read()
    print(content)
    file.close()

    文件操作三部曲:打开文件,读取文件内容,关闭文件;

    运行结果:

    F:workspace_pythonpycharm_projectsvenvScriptspython.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day01/01.py
    城市越来越大,我们却越来越远。也许我们之间的感情就像杯子一样,碰一碰才不会有距离。
    
    有时候,杯子多了就是一群人的狂欢,其实也是每个人的孤单,心情不好的时候,有谁愿意和我们说话;
    
    有时候我们听不进去别人的批评,也不愿意去多说,总在回忆过去那些兄弟姐妹之间的真心对话;
    
    生活中有些人,走近了又走远了。就像聚会再热闹,总有散伙的一刻;
    
    生活犹如一个杯子,满了,又空了,我们在对话,我们和杯子在对话,我们和自己在对话;
    
    
    Process finished with exit code 0

    注:

    1.使用文本文档新建一个文件,这时候open()函数中的参数encoding='utf-8' 就不需要啦,因为默认txt文件不是utf-8??反正我是会报错的,编码方式不写就可以直接打开txt文件啦;

    2.但是如果encoding='utf-8' 那么文本文档需要使用记事本打开,另存为的时候下方编码方式需要选择utf-8的形式保存;

    3.open()函数中文件的绝对路径的写法有三种:

         a. 路径前面加上 r:

    r 'F:workspace_pythonpycharm_projectsfullstack2018-08-17week2day01'     #加r 避免当成转义字符

        b.  变为\:

    "F:\workspace_python\pycharm_projects\fullstack2018-08-17\week2\day01\xixi.txt"   #---->\

        c.  变为/:

    F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day01/xixi.txt

    当然由于我的py文件和所要读取的txt文件在同一个目录下,所以可以不用写绝对路径,写相对路径即可:

    要注意:文件以什么方式存储就要以什么方式读取~

    读:r---读取文件 ; rb 二进制方式读取文件;

    file=open("dang",mode='r',encoding='utf-8')
    content=file.read()
    print(content)
    file.close()

    运行结果:

    F:workspace_pythonpycharm_projectsvenvScriptspython.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day01/01.py
    我是一个小可爱

    当以rb读取时:

    file=open("dang",mode='rb',encoding='utf-8')
    content=file.read()
    print(content)
    file.close()

    会报错:

    Traceback (most recent call last):
      File "F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day01/01.py", line 11, in <module>
        file=open("dang",mode='rb',encoding='utf-8')
    ValueError: binary mode doesn't take an encoding argument

    因为文件file本身就是用 rb 二进制读取的(bytes类型本身就是utf-8 参数没必要写啦)

    rb:当所要读取的文件是图像类型(非文字)或者是需要上传下载时可以用到 ~b方式

    正确写法:

    file=open("dang",mode='rb')
    content=file.read()
    print(content)
    file.close()

    运行结果:(bytes类型中文表现形式就是b后面十六进制)

    b'xe6x88x91xe6x98xafxe4xb8x80xe4xb8xaaxe5xb0x8fxe5x8fxafxe7x88xb1'

    写:w ----写;wb---二进制方式写;

    file=open("dang",mode='w',encoding='utf-8')
    content=file.write("大吉大利,今晚吃鸡")
    file.close()

    wb方式向文件中写内容时,open()函数中的参数encoding就不用写啦,因为本身wb就是以二进制方式写,bytes编码方式就是utf-8 (gbk)~~

    但是当你写内容时,是字符串对象,python3中字符串编码方式unicode 所以需要进行转换成utf-8才可以正确写入;

    file=open("dang",mode='wb')  #这里wb 已经是bytes类型编码是utf-8了就不用encoding啦
    content=file.write("带妹吃鸡,吃鸡萌妹".encode('utf-8'))  #由于所写的内容是str类型,str编码unicode 所以需要str(unicode)-->bytes(utf-8)
    file.close()

    追加(也是写的一种): a----在文件原来内容基础上追加新内容;ab---以二进制方式追加

    file=open("dang",mode='a',encoding='utf-8')  
    content=file.write("带妹吃鸡,吃鸡萌妹") 
    file.close()

    file=open("dang",mode='ab') #以二进制方式追加,bytes默认编码utf-8 所以不用再在open()中写encoding
    content=file.write("我是追加的内容".encode('utf-8'))  
    print(content)
    file.close()

     

    总结,当以wb 或者 ab 方式忘文件中写入内容时,open()函数中参数encoding 不用再写了,因为bytes类型本身默认编码就是utf-8 ;

    写入内容时由于是str 类型,编码方式是unicode 需要进行一个转换str.encode('utf-8') 把unicode编码的str  转换为utf-8编码的bytes;

    读写:r+ 读写

    上面的r  rb w wb a ab 都是只能读 或者只能写(清空了重新写,覆盖;和追加写),r+是既可以读又可以写:

    file=open('dang',mode='r+',encoding='utf-8')
    print(file.read())
    file.write("哈哈哈")
    file.close()

    运行结果:

    F:workspace_pythonpycharm_projectsvenvScriptspython.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day01/01.py
    带妹吃鸡,吃鸡萌妹带妹吃鸡,吃鸡萌妹我是追加的内容

    然后我们刚才写的‘哈哈哈’已经在文件中啦:

    如果我们再在写完之后再读一遍,是不是可以把哈哈哈也读到呢?

    file=open('dang',mode='r+',encoding='utf-8')
    print(file.read())
    file.write("哈哈哈")
    print(file.read())
    file.close()
    View Code

    是不可以的~因为r+是读取,可以再写,但是写之后的内容是读不到啦~就是因为写完之后光标已经移至最后一个位置,再度时从光标位置开始,所以后面没有东西当然读不到啦~

    我们可以这样操作:

    file=open('dang',mode='r+',encoding='utf-8')
    print(file.read())
    file.write("哈哈哈")
    file.seek(0)  #写完之后将光标移至最开始,在进行读取就ok了
    print(file.read())
    file.close()

     其实 r+读写,也可以先写,再读:

    file=open('dang',mode='r+',encoding='utf-8')
    file.write("哈哈哈")
    print(file.read())
    file.close()

    可以发现此时文件中的内容已经不是在末尾的哈哈哈了,而是从开头开始写,将原来的相应长度的内容覆盖了,然后此时先写再读的话读取的是剩下的原来未被覆盖的内容~

    不过一般不这样操作,知道就行啦~

    写读: w+ 

    file=open("dang",mode='w+',encoding='utf-8')
    file.write("我是中国人,我骄傲")
    print(file.read())
    file.close()

     

    可以看出来文件内容已经被新的内容覆盖了,而且w+写完再进行读取时是读不到内容的(类比w写完再进行读操作是会报错的),但是我们可以把光标移动到开头再进行读取:

    file=open("dang",mode='w+',encoding='utf-8')
    file.write("我是中国人,我骄傲")
    file.seek(0)  #写完之后将光标移至开头再进行读取
    print(file.read())
    file.close()

    追加读:a+ 原来a只可以写(追加的方式)现在可以追加完再读:

    file=open('dang',mode='a+',encoding='utf-8')
    file.write('小日本大坏蛋')
    file.seek(0)  #追加完之后把光标移动到开头,可以进行读取(包括追加完的内容)
    print(file.read())

    talk is cheap,show me the code
  • 相关阅读:
    【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF
    【Stage3D学习笔记续】山寨Starling(九):上下文丢失处理方法
    【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现
    echarts 百度图表
    java读properties文件 乱码
    百度地图 JSAPI使用 mark 定位地址 与周边覆盖物
    jstl format date
    MultipartEntity 乱码
    log4j与commons-logging,slf4j的关系
    maven 引入 net sf jsonlib 报错 has borken path
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9529465.html
Copyright © 2011-2022 走看看