zoukankan      html  css  js  c++  java
  • Day8--Python--文件操作

    对文件内部的内容进行操作
    1.open('文件路径', mode='模式(默认是读r)', encoding='编码')
    读取内容:
    f = open('d:/练习.txt', mode='r', encoding='utf-8') #处理非文本时不给encoding #f为变量,也称文件的句柄,因为不是将文件全部打开载入,而是通过句柄获取,减少内存占用.
    content = f.read() #f.read(3)读取三个字符
    print(content)

    line1 = f.readline().strip() #空白:空格, ,
    line2 = f.readline().strip() #从上边的接着读,lin1的末尾有一个换行,所以line2就换行,再加上第二个print也会换行,所以会出现空行
    print(line1)
    print(line2) #print(line2, end='**') end默认= 换行

       print('刘德华', '刘青云', '刘嘉玲', end=' ' , sep='') sep间隔sep='*'

    content = f.read() #一次全都读取出来,缺点:1.读取大的文件的时候,内存容易溢出 2.操作比较麻烦
    content = f.readlines() #全都加载进来,结果是列表

    f是一个可迭代对象
    for line in f: #内部其实调用的是readline()
    print(line)

    f.close() #关闭

    #read()
    f = open('d:/练习.txt', mode='r', encoding='utf-8') #编码默认跟着操作系统走的 GBK
    for line in f:
    print(line)
    f.close()

    #readline()
    f = open('d:/练习.txt', mode='r', encoding='utf-8')
    content = f.readline().strip()
    print(content)

    #readlines() 输出的是列表
    f = open('d:/练习', mode='r', encoding='utf-8')
    content = f.readlines()
    print(content)

    #write()
    f = open('d:/sylar.txt', mode='w', encoding='utf-8')
    f.write('娃哈哈') #写的时候先清空,再写入. w
    f.flush() #刷新,清空缓存区,将缓存内容写入文件中;如果不flush,默认缓冲区满或执行close()后将缓存内容写入文件.
    f.close()

    f = open("d:/sylar.txt", mode="w", encoding="utf-8")
    f.write("周笔畅 ") # 写的时候. 先清空. 再写入. w
    f.write("胡辣汤 ")
    f.write("实付款 ")
    f.flush()
    f.close()

    #writelines()
    f = open('../Day007集合,深浅拷贝/练习本.txt', mode='w', encoding='utf-8')
    content = f.writelines(['阿道夫', '甘道夫', '清道夫']) #writelines()与readlines()相对,是一列元素,且写出的每个元素之间没有空格
    f.flush()
    f.close()

    #append 追加写
    f = open("d:/sylar.txt", mode="a", encoding="utf-8")
    f.write("娃哈哈") # 追加写
    f.write("爽歪歪")
    f.flush()
    f.close()

    文件的路径:
    1.绝对路径:
    1.从磁盘根目录寻找
    2.网络上的路径
    2.相对路径
    相对于当前你这个程序所在的文件夹.(用的最多的)
    f = open('../Day007集合,深浅拷贝/练习本.txt', mode='w', encoding='utf-8')

    模式:
    r 读 只读模式
    w 写 只能写
    a 追加写,只能写

    b = bytes 这个时候处理的文件是字节
    操作非文本文件的时候用带b的
    rb
    wb
    ab

    r+ 读写模式
    w+写读模式
    a+追加读模式

    r+b
    w+b
    a+b

    # 文件拷贝 rb, wb
    f1 = open("d:/linux学院-桌面背景.jpg", mode="rb")
    f2 = open("E:/小明自拍.jpg", mode="wb")
    for line in f1:
    f2.write(line)
    f1.close()
    f2.flush()
    f2.close()

    # r+ 读写模式 正确用法:先读后写
    f = open("菜单", mode="r+", encoding="utf-8") # r+最常见
    s = f.read(1) # 读取一个字符
    print(s)
    f.write("胡辣汤") # r+模式. 如果你执行读了操作. 那么写操作的时候. 都是写在文件的末尾. 和光标没有关系
    # f.seek(0) 把光标挪到最前端
    # f.write("ab") # 在文件开头写入. 把原来的内容盖上

    # for line in f:
    # print(line)
    # f.write("蛋炒饭") #默认内容加到最后端
    # 正确用法: 先读后写
    # f.close()

    # w+写读模式
    f = open("菜单", mode="w+", encoding="utf-8") # 很少用.
    f.write("疙瘩汤")
    f.seek(0) # 移动到开头
    content = f.read()
    print("读取的内容是", content)
    f.flush()
    f.close()

    # a+ 追加读
    f = open("菜单", mode="a+", encoding="utf-8")
    f.write("韭菜鸡蛋饺子")

    f.seek(0)
    content = f.read()
    print(content)

    其他相关操作:
    1.光标:
    r: 光标在开头
    w: 光标在开头
    a: 光标在末尾

    seek(偏移量,位置)
    位置:0开头,1当前位置,2末尾
    f.seek(0) 光标移动到开头
    f.seek(0,2) 移动到末尾

    2.tell() 可知道光标位置
    f = open("⼩娃娃", mode="r+", encoding="utf-8")
    f.seek(0) # 光标移动到开头
    content = f.read() # 读取内容, 此时光标移动到结尾
    print(content)
    f.seek(0) # 再次将光标移动到开头
    f.seek(0, 2) # 将光标移动到结尾
    content2 = f.read() # 读取内容. 什么都没有
    print(content2)
    f.seek(0) # 移动到开头
    f.write("张国荣") # 写⼊信息. 此时光标在9 中⽂3 * 3个 = 9
    print(f.tell()) # 光标位置9
    f.flush()
    f.close()

    3.truncate 截断文件
    f = open("⼩娃娃", mode="w", encoding="utf-8")
    f.write("哈哈") # 写⼊两个字符
    f.seek(3) # 光标移动到3, 也就是两个字中间
    f.truncate() # 删掉光标后⾯的所有内容
    f.close()


    f.truncate(n) #如果给出n,则从n位置截断,否则从当前位置截断

    光标的单位是字节byte
    读写的时候 单位 字符

    with open(...) as f: #就不用加f.flush f.close
    表示上下两行是一行代码

    #文件的修改:
    1.从原文件中读取内容,修改内容,写入到文件副本中.
    2.删除源文件,重命名文件副本为源文件的名字

    import os
    with open("⼩娃娃", mode="r", encoding="utf-8") as f1,
    open("⼩娃娃_new", mode="w", encoding="UTF-8") as f2:
    content = f1.read()
    new_content = content.replace("冰糖葫芦", "⼤⽩梨")
    f2.write(new_content)
    os.remove("⼩娃娃") # 删除源⽂件
    os.rename("⼩娃娃_new", "⼩娃娃") # 重命名新⽂件
    # 弊端: ⼀次将所有内容进⾏读取. 内存溢出. 解决⽅案: ⼀⾏⼀⾏的读取和操作

    import os
    with open("⼩娃娃", mode="r", encoding="utf-8") as f1,
    open("⼩娃娃_new", mode="w", encoding="UTF-8") as f2:
    for line in f1:
    new_line = line.replace("⼤⽩梨", "冰糖葫芦")
    f2.write(new_line)
    os.remove("⼩娃娃") # 删除源⽂件
    os.rename("⼩娃娃_new", "⼩娃娃") # 重命名新⽂件

    #复制文件副本
    f1 = open("pic/图片.jpg", mode='rb') #此处地址只能是本地地址,不能是外部链接
    f2 = open('pic/图片_副本.jpg', mode='wb')
    for line in f1:
    f2.write(line)
    f1.close()
    f2.flush()
    f2.close()

    #爬取网络图片
    import requests #如果未安装,可执行cmd=>pip=>pip install requests
    rs = requests.get("http://pic1.win4000.com/wallpaper/0/510a14bbc8fcb.jpg") #地址为外部链接
    f = open('pic/壁纸1.jpg', mode='wb')
    f.write(rs.content)
    f.flush()
    f.close()
    '''
    3,文件a.txt内容:每一行内容分别为商品名字,价钱,个数。

    apple 10 3
    tesla 100000 1
    mac 3000 2
    lenovo 30000 3
    chicken 10 3

    通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。

    '''
    with open('homework/a', mode='r+', encoding='utf-8') as f:
    result = []
    for line in f:
    lst = line.split()
    dic = {'name': lst[0], 'price': lst[1], 'amount': lst[2]}
    result.append(dic)
    print(result)
    sum = 0
    for i in result:
    sum += int(i['amount'])*int(i['price'])
    print('总价为%s' % sum)
  • 相关阅读:
    VMware虚拟机下实现NAT方式上网的小方法
    文件附件上传
    [转] 深入了解 HTML 5
    用JS获取图片尺寸
    Stream与byte的转换
    递归算法
    搞懂java中的synchronized关键字
    初学UML之用例图
    浅析tomcat nio 配置
    面向对象:单一任务原则(SRP)
  • 原文地址:https://www.cnblogs.com/surasun/p/9636240.html
Copyright © 2011-2022 走看看