zoukankan      html  css  js  c++  java
  • python学习之文件操作

    #!/usr/bin/env python

    # -*- coding:utf-8 -*-

    # date:2018/06/08

     一. 初识⽂文件操作   

      python来读写文件是用open()函数来打开一个⽂文件, 获取到⽂文件句句柄. 然后通过文件句柄就可以进行各种各样的操作了. 根据打开方式的不同能够执行的操 作也会有相应的差异.     

      打开文件的方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤用的是r(只读)模式 

    二、读写操作

      默认读模式只能读文件,不能做写操作,写模式只能写文件,不能读文件,除非使用(+)加模式

    文件的操作顺序:

      1、找到文件,打开作业,指定模式,根据文件保存时的编码来指定编码格式 :open(“pathfile” , moth = “r/w/r+等”, encoding = “以什么编码格式显示文件内容”)

      2、根据对应模式所拥有的方法操作文件: f.read() 等其它操作

      3、关闭文件  :f.close()

    2.1、只读(r,rb)

      r 表示以字符来读取

      rb 表示以字节bytes来读取 ,如中文gbk 读取出来的格式为:b'xd6xd0',在读取图片,声音,视频文件时以此格式。

      无论rb还是wb,ab模式都不用指定encoding,因为文件存储最后都是字节的形式存起来的,如果指定将报错

      # ValueError: binary mode doesn't take an encoding argument 

      f = open("pathfile.txt", mode = "r", encoding = "UTF-8")   # 找到文件,指向一个变量即句柄

      content = f.read()   

      print(content)

      f.close()

    注:文件都有一个指针,读模式是从开头即指针为0时,进行读取的,当读取完毕后,指针停在文件的末尾,如果后面没有内容,不关闭文件的情况下,继续读取将读取的时空白

      f.read()一次性读取文件的全部内容,如果文件过大,将导致内存崩溃,系统宕机

      f.read  (n)   可以指定读取文件的范围,如果模式为r ,n表示几个字符,如果模式时rb,n表示几个字节(此处涉及到编码级,utf-8 中文表示3个字节,gbk 中文表示2个字节) 

         f.readline()  一次读取一行数据,readline() 默认末尾都加了 换行,如果想文件好看,需要在后面加上strip() 去掉换行符 

            f.readlines()  把每一行一次读取出来放到一个列表中,然后需要对文件操作可以for循环,但同样文件过大时,会导致内存溢出,慎用。

      f.readable()   判断当前模式是否可读

      f.writeable()  判断当前模式是否可写

            如果需要对文件操作,可直接循环句柄f,它是一行一行拿出来进行操作的。

        for  line   in   f :

          print(line.respace(old,new))

    2.2、只写(w, wb)

    写模式,如果文件存在,则清空文件内容,如果文件不存在,则创建新文件,都是从开头写,写完指针停留在最后,直到关闭文件。

      f.write("内容")      内容只能是字符串,如果想将列表的元素写入只能通过for循环列表,直接填入列表,将报错。

      f.flush()    写完内容记得要及时将内容从缓存写入磁盘,不然可能导致内容没有写入文件

           f.close()

    2.3、 在读写的基础上附加功能

      r +  读写,指针从零开始先读后写,如果先写的话,因打开文件指针在0处,写入的内容将从头覆盖相应长度的原文件内容(最常用)

           w+  写读,先清空,后从头写入文件,因指针在文件尾部,读取文件为空白

      a     追加模式,不能读,只能写,不会清空文件,会在尾部追加内容

      a+    追加读,不会清空文件,在尾部追加内容,因指针在尾部,读取文件时同样空白

           总结:在不改变指针位置的情况下,a、w+、a+ 都无法读到内容,因为加完内容后指针都在文件尾部

    2.4、获取文件的位置即指针,及改变文件的指针

      f.tell()    获取当前文件的位置,也是以字节为单位

      f.seek(n)   指定指针的位置,n是以字节为单位,如果是gbk,n 需要为2的倍数,utf-8 ,n 需要为3的倍数

      移动到开头:f.seek(0)

      移动到结尾:f.seek(0,2)        0表示偏移量,2表示结尾,1表示当前位置

     在r+模式下. 如果读取了了内容. 不论读取内容多少. 光标显⽰示的是多少. 再写入 或者操作⽂文件的时候都是在结尾进⾏的操作. 

    2.5、截断truncate(),只有在有写的模式下才能截断

    想截断:

    方法1、通过seek(n)移动指针到截断位置,truncate()

    方法2、通过truncate(n)n没有指定是删除截断位置后的所有内容,n指定了就从头开始到n个字节

    三、绝对路劲与相对路劲

      绝对路劲:从根目录到当前位置如:c:installfile.txt

      相对路劲: 同一个文件夹的文件相对于当前程序所在的文件夹而言   。 ..表示当前位置的上级目录  (常用)

    2.6、通过with……as 操作文件

      因为通过f = open("pathfile.txt", mode = "r", encoding = "UTF-8")很容易忘记关闭文件导致错位,故一般用with方式,它无需我们手动关闭,在我们操作完毕后

      with  open("pathfile_name", moth = "w" , encoding= "utf-8")  as f:

        f.write("name")

        f.flush()

    四、文件的修改

      1、打开要修改的文件old_file,读取文件

      2、创建一个新文件new_file,将从old_file中读取的内容写入到new_file

      3、将ole_file文件删除

      4、将new_fiel文件名改为ole_file文件名

     

     1 import os
     2 with open("file东京热.txt", "r",encoding= "utf-8") as f1,
     3      open("file北京热.txt", "w" ,encoding= "utf-8") as f2:
     4     new_date = f1.read().replace("苍老师", "饭岛爱")  # 将原文件读到内存,进行修改
     5     f2.write(new_date)  # 将修改后的内容写入到新文件中
     6 os.remove("file东京热.txt")
     7 os.rename("file北京热.txt", "file东京热.txt")
     8 
     9 # 上面这种格式如果文件很大,就会造成内存崩溃,最好使用for循环句柄
    10 
    11 import os
    12 with open("file东京热.txt", "r", encoding= "utf-8") as f1,
    13      open("file东京热_new.txt", "w", encoding="utf-8") as f2:
    14      for line in f1:
    15          new_data = line.replace("饭岛爱", "小泽玛利亚")  # 逐行修改文件内容
    16          f2.write(new_data)     # 将修改后的文件写入到新文件中
    17 os.remove("file东京热.txt")
    18 os.rename("file东京热_new.txt", "file东京热.txt")
  • 相关阅读:
    Permission Denial: opening provider 隐藏的android:exported属性的含义
    GPL & Apache License
    JAVA把毫秒数转换成日期
    Android开发–Intent-filter属性详解
    [转]unix/linux中的dup()系统调用
    【转载】技术的正宗与野路子
    virtualbox -centos ping不通外网
    GNU Make 手册中文版
    Git源码学习
    git-gui
  • 原文地址:https://www.cnblogs.com/sunxiuwen/p/9155190.html
Copyright © 2011-2022 走看看