• python之路-day08-文件操作


    一、文件操作基本用法

    1、

    open 表示打开一个文件

    f 变量,操控 hehe.txt文件句柄

    f = open("hehe.txt", mode="r" ,encoding="utf-8")

    #读取文件中的内容

    # read(n) 读取n个字符

    content = f.read(3)   #读取三个字符

    content = f.read()  #一次性全部读取出来

    line = f.readline()  # 读取一行数据

    print(line.strip())  # strip() 去掉空白。空格   

    lst = f.readlines()  # 一次性全部读取出来,返回的是列表

    print(lst)

    2、路径问题

      两种:

      a 、 绝对路径(当文件路径是固定的时候)

        从磁盘根目录找文件。 windows 下用的就是 c,d,e,f      linux:   /user/bin/xxx

      b、相对路径(用的多)

        相对路径相当于当前程序所在的文件夹

        ../  表示上一层文件夹

    3、注意事项:

      1)、       等转义字符。有固定含义的,出现在路径中就会造成麻烦,可多加 .。推荐使用r

        f = open(r"E:哈哈 hehe.txt",mode="r", encoding="utf-8")   # 路径前面加上 r ,意为禁止路径中的转义

        print(f.read())                              

      

      2)、f = open("hehe", mode="r", encoding="utf-8")

        #正常情况下不能用

        f.read()  

        f.readlines()    # 直接用容易造成内存溢出

      3)、必须要掌握的

        文件句柄是一个可迭代对象

        f = open("hehe", mode="r", encoding="utf-8")

        for line in f:  # 读取文件中的内容。一行一行的读取, 每次读取的内容交给变量 line

          print(line.strip())

      4)、 r :只读

        w:只写,注意open打开时会清空文件,文件不存在时会创建文件

        a:append  在文件尾部追加内容,文件不存在时同样可以创建文件

    二、 文件操作之 w  a

    1、 mode="w"     # 假如文件不存在时,w可以帮我们创建文件

      f = open("taibai", mode="w", encoding="utf-8")

      f.write("太白 ")

      f.write("很白 ")

      f.write("特别白 ")

      f.close()

    2、f = open("taihei", mode="a", encoding="utf-8")

      f.write("太黑了 ")

      f.write("很黑 ")

      f.write("特别黑 ")

      f.close()            

    3、文本文件的赋值

      f1 = open(r"c:日记本.txt", mode="r", encoding="utf-8")

      f2 = open(r"d日记本.txt", mode="w", encoding="utf-8")

      for line in f1:  # 从f1中读取数据

        f2.write(line)  # 写入到 f2 中

      f1.close()

      f2.close()

    三、文件操作之 b

      b - bytes  读取和写入的是字节,用来操作非文本文件(图片,音频,视频)

      rb  wb  ab

    # 需要掌握的:

    # 把胡一菲.jpg 从c盘复制到d盘,单纯的的从bytes 角度来复制的。适用于所有的文件

    f1 = open(r"c:胡一菲.jpg", mode="rb")

    f2 = open(r"d:胡二菲,jpg", mode="wb")

    for line in f1:    # 分批量的读取内容

      f2.write(line)  #open() 出来的结果可以使用read或者write。

    f1.close()

    f2.close()

    四、文件操作之 +

    r+ :读写,  w+:写读,  a+ :追加写读,  r+b, w+b , a+b

    1、r+

    # 正常点的,可用的-------先读取内容,后光标跳到最后再写

    f = open("person", mode="r+", encoding="utf-8")

    content = f.read()

    f.write("黄蓉")

    print(content)

    # 错误的示范

    f = open("person", mode="r+", encoding="utf-8")

    f.write("杨千嬅")   #默认直接写入的话,是从开头写入。 覆盖开头的内容

    content = f.read()

    print(content)

    # 坑 : 不论你读取多少内容。再次写入的时候都是在末尾(手动调光标可选定写入位置)

    f = open("person", mode="r+", encoding="utf-8")

    info = f.read(3)

    f.write("辣眼睛")

    print(info)

    2、w+

    f = open("person", mode="w+", encoding = "utf-8")  # 先清空然后再操作

    f.write("你好,我叫巫妖王")

    content = f.read()    # 写入东西后,光标在末尾,读取不到内容

    print(content)

    f.close()

    3、a+ ,    #不论光标在何处,写入的时候都是在末尾

    f = open("person", mode="a+",encoding="utf-8")

    f.write("我叫李嘉诚")  # 默认写在末尾

    综上: r+ 、w+ 、a+ 都是后坑的地方,切记少用,注意神坑

    五、光标

    1、seek() 小试

    # 文本信息: 李雷是大烧饼

    f.seek(3)  # 以字节为单位----移动三个字节

    f.read(3)  # 以字符为单位,读取三个字符  

    结果: 雷是大

    2、seek() 的应用

    seek(参数1, 参数2)

    参数1:表示是偏移量,移动多少个字节单位

    参数2: 表示从什么位置进行偏移(0:开头  1:当前位置  2:末尾)

    # 把光标移动到文件开头:seek(0)  #参数2 不写默认为0

    # 把光标移动到末尾:  seek(0,2)

    print(f.read(2))   # 读取两个字符

    f.seek(0)  # 回到开头

    print(f.read(2))   # 读取两个字符

    3、tell()  # 返回当前光标位置

    info = f.read(3)

    print(info)

    print(f.tell())  # 获取光标位置

    4、truncate()  截断文件。慎用

    六、文件修改

    # 将文件中的"善良" 改为"sb"

    import os  # 导入os模块

    import time  # 导入时间模块

    # with 语句的优点,自动关闭连接

    with open("唐诗", mode="r", encoding="utf-8") as f1,

      open("唐诗_副本",mode="w", encoding="utf-8") as f2:

      for line in f1:

        line = line.replace("善良","sb")

        f2.write(line)

    time.sleep(5)

    os.remove("唐诗")   # 删除源文件

    time.sleep(5)

    os.rename("唐诗_副本","唐诗")   # 把副本改名成源文件

    七、 文件操作应用

    文件内容:  fruit.txt

    id  水果  价格  数量

    1  苹果  5    50000

    2  葡萄  7    60000

    ......

    f = open("fruit.txt" , mode="r" , encoding="utf-8")

    titles = f.readline().strip()    # 读取第一行,同时可以将光标移到第二行开头

    title_lst = titles.split(",")  # ["id","水果","价格","数量"]

    lst = []

    for line in f:  # 光标开始从第二行读取

      dic = {}

      ll = line.strip().split(",")

      for i in range(len(title_lst)):

        dic[title_lst[i]] = ll[i]

      lst.append(dic)

    f.close()

    print(lst)

  • 相关阅读:
    .net core使用 AutoMapper
    使用 ASP.NET Core 和 Entity Framework Core 入门
    使用vue-quill-editor图片上传
    使用NPOI 做Excel导出
    利用SmtpClient类发送邮件
    使用Area(区域)会遇到的问题
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器
    MySQL的内存都用在了哪里
    (转载)MySQL buffer pool中三种page以及链表
    MySQL8.0备份工具之Xtrabackup
  • 原文地址:https://www.cnblogs.com/alvin-jie/p/9857741.html
Copyright © 2020-2023  润新知