• python--中的文件操作


    1.文件操作 

      把文件打开

    open 打开
    f = open ('文件路径',mode='模式',encoding='编码格式')
    #打开一个文件操作的时候取到的是一个句柄

      读取的方法

    . read()      将文件中的内容全部读取出来. 弊端: 占内存.如果文件过大,容易导致内存崩溃
    . read(n) 默认:读去文件内容全部read(n) 读取n个字符 . readline() 一次读取一行数据 , 注意每次读出来的数据都会有一个 需要使用strip()去空格 . readlines() 读取全部. 返回列表,也容易出现内存崩溃的问题,不建议使用

    for line in f: 每次读取一行内容
       print(line.strip())

      1.  只读( r , rb)    读取文件的相关操作

         rb. 读取出来的数据是bytes类型, 在rb模式下, 不能选择encoding字符集

         rb的作用: 在读取非文本文件时,比如读取MP3.图像. 视频等信息的时候就需要用rb. 因为这种数据没办法直接显示出来

      2.  只写(w , wb)  

         w 写入,只写,如果没有文件会创建文件,文件存在会清空文件,再写入新的内容

         wb 模式下,可以不指定打开文件的编码.但是在写文件的时候必须将字符串转化成utf-8的bytes数据

      3.  追加(a ,ab)

         追加模式下,写入的内容会追加在文件的末尾. 追加写读所有带b的操作就是对bytes进行操作, 主要用于非文本文件的时候比如音频 图片 视频rbwb就适用这个

       可用于断点续传.

         a模式也可以创建文件

      4.  读写 (r+ , r+b)

         读写模式必须是先读,因为默认光标是在开头的

         r+ 模式下必须先读取再写入

      5.  写读 (w+ , w+b)

         先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用

      6.  写读(追加 写读)a+ 

         a+模式下,不论是先读还是后读,都是读取不到数据的,因为追加之后光标在末尾,如果需要读取数据要移动光标seek

    二.文件操作中关于文件句柄的相关操作

    1. seek() 移动光标

    seek:两个参数
    1. 表示偏移量
    2. 从xxx开始偏移, 默认0, 开头 1, 当前位置 2, 末尾

        f.seek(0) 移动到开头

      f.seek(0, 2) 移动到末尾, seek的第二个参数表示的是从哪个位置进行偏移, 默认是0, 表示开头, 1表示当前位置 2表示结尾

    2. tell()返回光标所在的位置

    print(f.tell())

    3. truncate() 截断文件

    f = open("文件1", mode="w", encoding="utf-8")
    f.write("哈哈") # 写入两个字符
    f.seek(3) # 光标移动到3, 也就是两个字中间
    f.truncate() # 删掉光标后面的所有内容
    f.close()
    
    f = open("文件1", mode="r+", encoding="utf-8")
    content = f.read(3) # 读取12个字符
    f.seek(4)
    print(f.tell())
    f.truncate() # 后面的所有内容全部删掉
    # print(content)
    f.flush()
    f.close()

    三.文件修改 

    文件修改的步骤

      1.先从文件中读取数据

      2.把要修改的内容修改

      3.写入新文件

      4.删除旧文件

      5.给新文件改名

    # 导入os模块  os表示操作系统
    import os
    
    # f = open("夸一夸123", mode="r", encoding="utf-8")
    # f2 = open("夸一夸123_副本", mode="w", encoding="utf-8")
    
    # with会自动的帮我们关闭文件的链接
    with open("夸一夸123", mode="r", encoding="utf-8") as f, 
         open("夸一夸123_副本", mode="w", encoding="utf-8") as f2:
    
        for line in f:
            if "好人" in line:
                line = line.replace("好人", "sb")
            f2.write(line)
    
    # time.sleep(3) # 程序暂停3秒  这里让程序暂停就是为了直观的显示功能,计算机处理速度过快 看不出来
    
    # 删除原来文件
    os.remove("夸一夸123")
    
    # 重命名副本为原来的文件名
    os.rename("夸一夸123副本", "夸一夸123")

    一个重要的练习:

    名字  数量 价格  数量
    香蕉   1     85     50
    苹果         2    60        30
    
    
    编号,名称,价格
    1,香蕉,1,85
    2,苹果,2,6
    要想获得这些数据
    
    
    f = open("水果.txt", mode="r", encoding="utf-8")
    
    lst = []
    for line in f:  # 1,香蕉,1.85,50
        dic = {}  # 每行都是一个字典
        line = line.strip()  # 去掉空白  
     1,香蕉,1.85,50
        a, b, c, d = line.split(",") # [1, 香蕉, 1.85, 50]
        dic['id'] = a
        dic['name'] = b
        dic['price'] = c
        dic['totle'] = d
        lst.append(dic)
    
    print(lst)
    
    
    # f = open("水果.txt", mode="r", encoding="utf-8")
    # line = f.readline().strip() # 第一行内容,   编号,名称,价格,数量,哈哈
    # h,i,j,k = line.split(",")
    # lst = []
    # for line in f:  # 1,香蕉,1.85,50
    #     dic = {}  # 每行都是一个字典
    #     line = line.strip()  # 去掉空白  
     1,香蕉,1.85,50
    #     a, b, c, d = line.split(",") # [1, 香蕉, 1.85, 50]
    #     dic[h] = a
    #     dic[i] = b
    #     dic[j] = c
    #     dic[k] = d
    #     lst.append(dic)
    #
    # print(lst)
    
    
    
    f = open("水果.txt", mode="r", encoding="utf-8")
    line = f.readline().strip() # 第一行内容,   编号,名称,价格,数量,哈哈
    title = line.split(",") # [编号,名称,价格,数量,哈哈]
    lst = []
    i = 0
    
    for line in f:  # 1,香蕉,1.85,50
        dic = {}  # 每行都是一个字典
        line = line.strip()  # 去掉空白  
     1,香蕉,1.85,50
        data = line.split(",") # [1, 香蕉, 1.85, 50]
    
        for i in range(len(title)):
            dic[title[i]] = data[i]
    
        lst.append(dic)
    
    print(lst)
  • 相关阅读:
    Node_初步了解(4)小爬虫
    JS_高阶函数(map and reduce)
    tabel表格表头固定-标题固定
    js全选 不选 简单写法
    js 对象里 增加、删除一项字段 (把某对象里的数组转换为字符串,重组为新对象)
    手机号验证等汇总
    jq清除该站点的所有cookie
    ajax传参多个冒号 :
    [Vue warn]: Duplicate keys detected: ''. This may cause an update error.
    js的小数位数和保留小数点四位数字等验证
  • 原文地址:https://www.cnblogs.com/robertx/p/10073026.html
Copyright © 2020-2023  润新知