• 第六章 文件的操作


    1、文件路径

    绝对路径and相对路径

    1. 绝对路径:

      从磁盘的根目录或者从互联网上寻找一个路径,确定文件一定在哪里时可以用绝对。

    2. 相对路径(多用):

      相对于当前程序所在的文件夹 ../上一层文件夹。

    绝对路径

     f = open("f:/abc/ls.txt", mode="r", encoding="gbk")
     s = f.read()
     print(s)
     f.close()

    相对路径

     # 同一文件夹下只写文件名即可, ../表示上一文件夹
     f = open("你好", mode="r", encoding="UTF-8")
     s = f.read()    # read()文件之后需要赋值给变量
     print(s)
     f.close() # 如果没有这句话, 你在下面的程序中如果删除这个文件. 就会报错

    2、文件的for循环

    文件是可迭代对象可以用 for 循环 读取文件中全部内容:

    # 读取文件中全部内容
    f = open("你好", mode="r", encoding="utf-8")
    for line in f:  # 文件是一个可迭代对象
        print(line.strip()) # 一行一行的处理数据

    或者如下两种方法:(不常用,因为一直在运行)

     f = open("你好", mode="r", encoding="utf-8")
      2 while 1:
      3     s = f.readline().strip() # 一次读一行
      4     if s!= "":
      5         print("内容是",s)
      6         
      7 f = open("你好", mode="r", encoding="utf-8")
      8 lst = f.readlines()   # 会一直读取
      9 print(lst)
     10 f.close()

    3、读写操作

    r  w  a  r+  w+  a+  rb  wb  ab  r+b  w+b  a+b

    r :只读

    • s=f.read( ) 读取的所有内容 for line in f: 按行循环

    • s=f.readline( ) 读取一行的内容

    • s=f.readlines( ) 读取的内容会放入到列表中,一行表示一个元素

     f=open('../text/ll',mode='r',encoding='UTF-8')
     s=f.read()     
     print(s)
     f.close()
     ​
     f=open('../text/ll',mode='r',encoding='UTF-8')
     for line in f:   
         print(line.strip())
     f.close()

    w:只写

    • 带 w 的,会清空原来的,如果文件不存在,会自动创建新的文件。

     f=open('你好.txt',mode='w',encoding='UTF-8')
     f.write('jdijdi')  #第一次写入,会清空之前的内容
     f.write('kkkkk')   #第二次写入,不会清空上条语句写入的内容
     f.flush()  #刷新
     f.close()  #关闭

    a :追加写入

    • 默认在结尾处追加,所有的写入换行,需要手动添加 “ n "换行符

     f=open('你好.txt',mode='a',encoding='UTF-8')
     f.write('jdijdi
    ')
     f.write('kkkkk')
     f.flush()
     f.close()

    rb wb ab : 带b的处理的是非文本文件,用bytes来处理

    • 当mode中含有b时,不能给定encoding

     # 将图片从C盘移动到E盘  
     f=open('c:/abc.jpg',mode='rb')  #这里不能写encoding
     e=open('e:/abc.jpg',mode='wb')
     for line in f:  #从f中循环,在e盘中写入
         e.write(line)
     f.close()
     e.flush()
     e.close()

    r+:读写

    • 工作时常用(最好用的读写同时存在的模式)

    • 读取时,默认光标在最前面,从头开始读

    • 无论光标在哪里,写入时都在结尾处,

    • 除非上来就写入,写在开头替换掉开头原来的内容

     f=open('你好.txt',mode='r+')
     s=f.read(3)  #读取了3个字符
     f.write('世界')   #写在末尾
     print(s)
     ​
     f=open('你好.txt',mode='r+')
     f.write('世界')   #写在末尾
     print(s)

    w+ :写读

    • 带w的会清空文件中的之前的内容,因此很少用

     # 很少用. 因为会清空文件中的内容
     f = open("阿西吧", mode="w+", encoding="utf-8")
     f.write("张云雷也要退出德云社") # 写完之后光标在最后. 读取是没有内容的
     f.seek(0) # 移动光标, 移动到开头
     s = f.read()
     print("读取的内容是",s)  #读取的内容为空,光标后没有东西
     f.flush()
     f.close()

    a+ :追加 写/读

    • 光标默认在最后

     f = open("你好", mode="a+", encoding="utf-8")
     f.write("我要加入德云社")  #在结尾处写入
     f.seek(0)    #光标移动到开头
     s = f.read()   #从开头读取内容
     print(s)    #打印所有内容
     f.flush()   #刷新

    四、其他操作

    光标 :f.seek()

    • 开头:f.seek(0) 结尾:f.seek(0,2)

     # 常用的 开头结尾  css中常用
     f.seek(0) # 开头  偏移量是0
     f.seek(0,2) # 结尾  偏移量是0 
     # 光标位置
     f.seek(3) # 等于f.seek(3,0) 在开头处偏移量是3个字节即一个字符
     f.seek(3,1) # 在当前位置偏移量是3
     f.seek(3,2) # 在结尾处的偏移量是3 
     # 反复读取
     f=open('你好.txt',mode='r',encoding='utf-8')
     for line in f:
         print(line.strip())
     f.seek(0)  #光标移动到开头
     for line in f:
         print(line.strip())
     f.close()

    查询光标位置:f.tell( )

    • 返回的时seek值,即字节

     f = open("啊同类个同同同", mode="w", encoding="utf-8")
     f.write("哇哈哈哈哈压缩盖伦")
     f.seek(9)
     print(f.tell())   # 9
     f = open("你好", mode="r", encoding="utf-8")
     f.seek(3) # 3byte => 1中文
     s = f.read(1) # 读取一个字符
     print(f.tell()) # 光标在哪儿???  如果文件中为汉字 输出为6
     f.close()

    截断文件:truncate( )

    • truncate() 截断文件

      默认从文件开头截断到光标位置 删除光标后面的内容

    • truncate(12) 默认从文件开头截断到参数位置 删除后面的内容

     # 从文件开头截断到光标位置
     # 如果给参数. 从头截断到参数位置
     f = open("你好", mode="w", encoding="utf-8")
     f.write("哇哈哈哈哈压缩盖伦")
     f.seek(9)
     print(f.tell())
     f.truncate(12)
     f.close()

    4.修改操作

    将日志文件存储为列表形式的记录

     ID,name,phone,car
     1,jiumo,10086,特斯拉
     2,wusir,10010,劳动而扣分
     3,taibai,10000,激动
     4,ritian,12345,小黄车
    
     # 将以上给出的日志做成一条条记录存放在列表中
     lis=[]
     with open('20180806.log',mode='r',encoding='utf-8') as f:
         first=f.readline().strip().split()  #第一行放入列表中必须用readline()
         for line in f:   #循环文件的行
             dic={}       #用来存放每一行记录
             ls=line.strip().split(',')   #每一行进行切割
             for i in range(len(first)):
                 dic[first[i]] = ls[i]
             lis.append(dic)
     print(lis)

    5、修改文件

    步骤

    1. 引入os模块 import os 

    2. 打开目标文件, r

    3. 打开文件副本, w

    4. 从r中读取内容进行修改. 写入到副本中

    5. 删除源文件

    6. 重命名副本

     import os
     with open('你好',mode='r',encoding='utf-8') as f1, 
          open('你好_副本',mode='w',encoding='utf-8') as f2:
         for line in f1:
             line=line.replace('jiumo','sba')
             f2.write(line)
     os.remove('你好')
     os.rename('你好_副本','你好')
  • 相关阅读:
    【二分】XMU 1587 中位数
    【动态规划】XMU 1560 新ACM规则
    【最短路】Vijos P1046 观光旅游
    【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)
    一周多没打代码了。。
    6.4 文件与文件夹操作
    6.3.4 使用marshal 模块操作二进制文件
    6.3.3 使用 shelve 模块操作二进制文件
    6.3.2 使用struct模块读写二进制文件
    6.3.1 使用 pickle 模块读写二进制文件
  • 原文地址:https://www.cnblogs.com/jiumo/p/9440747.html
Copyright © 2020-2023  润新知