• 文件的操作


    文件操作的大纲:

    读模式:
            *r
                read
                read(n)
                readline()
                readlines()
                for循环 最好的
            rb
            *r+
            r+b
    
        写模式:
            *w
                w:没有文件,创建文件写内容。
                w:如果有文件,清空原文件,写入新内容。
            wb
            w+
            w+b
        追加模式
            *a
                a:没有文件,创建文件写内容。
                a:如果有文件,最后面追加新内容。
            ab
            a+
            a+b
            补充:
                gbk utf-8
                对于字母,数字,特殊字符的编码都是引用ascii码,所以可以直接转化。
                s1 = '123abc*'
                b1 = s1.encode('utf-8')
                s2 = b1.decode('gbk')
                print(s2)
    View Code
    一,文件操作初识
    创建一个文件例:新建一个报表.txt,保存在D盘下。用python代码去写,类似于wap,word的应用程序功能
    f1 = open('d:学生家长联系方式.txt', encoding='GB2312', mode='r')
     print(f1.read())
     f1.close()
    path   文件路径: d:人员联系方式.txt
    encoding编码方式: utf-8 , gbk.....
    mode    操作方式:只读,只写,追加,读写,写读...
    路径:绝对路径:从根目录开始,一级一级的一直找,找到文件为止,在Pytharm里,打开文件,得到文件句柄并赋值给一个变量。
    相对路径:从当前目录开始找到文件。
    绝对路径:
    f1 = open (' d:人员联系方式.txt' , encoding = 'utf-8' ,mode='r')
    print(f1.read())
    f1.close    (绝对路径就是在A,B,C,D,E,的盘里面找,不在同一个文件夹里面找)。
    View Code
    相对路径:
    f2 = open('人员联系方式.txt' ,encoding = 'utf-8')
    print(f2.read())
    f2.close()                  (在同一个文件里面找)
    View Code
    变量:f1_obj,f1_file,file,file_handle...文件句柄。
    open python的内置函数,但是底层调用的Windows系统的open功能,open功能就是操作文件用的。
    windows 系统默认的编码方式gbk,linux,macos:utf-8.
    流程:
    1,打开文件,产生文件句柄。 
     2,对文件句柄进行相应的操作。
      3,关闭文件。
    View Code
    错误原因分析:
      UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte
             编码错误:文件存储时编码方式与文件打开时的编码方式不一致。
            SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated uXXXX escape
    View Code
    改正错误 两种:
    第一种:加r
    f1 = open(r'd:u护士空姐学生少妇联系方式.txt', encoding='GB2312', mode='r')
                print(f1.read())
                f1.close()
    View Code
    
    
     第二种:加
      f1 = open('d:\护士空姐学生少妇联系方式.txt', encoding='GB2312', mode='r')
                print(f1.read())
    View Code
    读模式
    ***  r:只读,可以默认不写   
    r ,rb 模式:
    r模式,read(n) 是按照字符读取。
    rb模式。read(n) 是按字节读取。
    f.read()全部读出来
    f1 = open ('E:人员联系方式'.txt,mode='rb')
    print(f1.read())
    f1.close()
    ##b'xefxbbxbfxe5xa5xbdxe7x9ax84xe5xa5xbdxe7x9ax84xe5xa5xbdxe7x9ax84xe8xb0
    View Code
     f.read(n)
    f1 = open('护士学生空姐班主任.txt', encoding='utf-8')
    print(f1.read(3))
    f1.close()
    View Code
    bytes类型只操作非文字文件
    f1.readline()  按行读取.
    f1 = open('E:人员联系方式‘txt',encoding='utf-8')
    print(f1.readline())
    print(f1.readline())
    print(f1.readline())
    print(f1.readline())
    View Code
    readlines( )返回一个list,里面的元素是每一行。
    f1 = open('E:人员联系方式‘txt',encoding='utf-8')
    print(f1.readlines())
    f1.close
    View Code
    for 循环去读去。
    f1 = open('E:人员联系方式‘txt',encoding='utf-8')
    for line in f1:
            printd(line)
    f1.close()          #打印出来的是写入的文字
    View Code
    rb 模式 非文字类文件
    f1 = open('护士学生空姐班主任.txt',mode='rb')
    print(f1.read(1))
    f1.close() 
    View Code
    凡是带b不用encoding
     只有是r模式 mode='r'可以省略不写
    rb bytes类型读取。
    带b的都是非文本文件 , rb模式  非文字类文件
    ***r+:读写,先读后写
    f1 = open('E:人员联系方式.txt',encoding='utf-8',mode='r+')
    print(f1.read())
    f1.write('666')
    f1.close( )   #  打印出写的文字
    View Code
    r+b:读写,先读后写
    f1 = open('E:人员联系方式.txt',mode='r+b')
    print(f1.read())
    f1.write('666'.encode('utf-8'))
    f1.close( )     #b'xefxbbxbfxe5xa5xbdxe7x9ax84xe5xa5xbdxe7x9a
    View Code
    写模式:
    w,wb 模式
    w:写:没有文件,创建文件写内容。如果有文件,清空原文件,写入新内容。
    f1 = open('log1',encoding='utf-8',mode='w')
    f1.write('老男孩是最好的培训学校。。')
    f1.close
    f1 = open('log1',encoding='utf-8',mode='w')
    f1.write('老男孩’)
    f1.close()
    View Code
    wb 模式
    f1 = open('log2', mode='wb')
    f1.write('法国进口分类结果'.encode('utf-8'))
    f1.close()
    View Code
    rb与wb的区别
    f1 = open('log2',mode='wb')
    f1.write('老男孩'.encode('utf-8'))
    f1.close()
    View Code
    w+:先写后读
    f1 = open('log1',encoding='utf-8',mode='w+')
    f1.write('老男孩...')
    f1.seek(0)    #调整光标
    print(f1.read( ))
    f1.close()      #老男孩...
    View Code
    追加模式
    w + b
    a   ab
       补充:对于英文字母数字特殊字符,utf-8与gbk可以互相识别。
    但非字母就不可以。
    f1 = open('log1',encoding='utf-8',mode='a')
    f1.write('barry')
    f1.close()
    View Code
    a:没有文件创建文件写内容。
    a+:有文件,直接在元文件的后面住家新内容。
    f1 = open('log3',encoding='utf-8',mode='a')
    f1.write('barry')
    f1.close()
    f1 = open('log3',mode='ab')
    f1.write('中国'.encode('gbk'))
    f1.close()        #(打印增加乱码,把'gbk'换成'utf-8'出现中国
    View Code
    a+ 追加可读
    f1 = open('log3', encoding='utf-8', mode='a+')
    f1.write('范德萨急功近利开发工具')
    f1.seek(0)
    print(f1.read())        #中国范德萨急功近利开发工具
    f1.close()
    View Code
    ps  非文字的文件的读取写入
    f1 = open('11.jpg',mode='rb')
    content = f1.read()
    print(content)
    f2 = open('小猪配奇'.jpg',mode='wb')
    f2.write(content)
    View Code
    常用方法:
    readlable() 判断是否可读
    writeable()判断是否可写
    f1 = open('log1', encoding='utf-8')
    print(f1.readable())
    print(f1.writable())
    f1 = open('log1', encoding='utf-8',mode='r+')
    print(f1.readable())
    print(f1.writable())
    read   wtite   read(n)   readline()  readlines()  seek
    f1 = open('log1',encoding='utf-8')
    print(f1.readable())              #True
    print(f1.writable())                False
    View Code
    seek:按照字节去调整光标
    seek(0)从开始调节
    seek(0,2)将光标调整到最后
    f1 = open('log1',encoding='utf-8')
    f1.seek(3)
    print(f1.read())
    f1.close()
    View Code
    tell也是按字节读告诉光标位置
    1 = open('log1', encoding='utf-8')
    print(f1.tell())
    print(f1.read())
    print(f1.tell())
    f1.close()
    View Code
    struncate    (a,a+模式下)对原文件进行截取内容,以字节形式,只能在a模式下使用。
    f1 = open('log1',encoding='utf-8',mode='w')
    f1.truncate(3)
    f1.close()
    View Code
    gbk,utf-8
    对于字母,数字,特殊字符的编码都是引用ascii码,所以可以直接转化。
    s1 = '123abc*'
    b1 = s1.encode('utf-8')
    s2 = b1.decode('gbk')
    print(s2)                  #123abc*
    View Code
    文件对的另一种写法:
    with open() as 不用主动关闭 f1.close()
    同一open 可以操作多个文件
    with open('log1', encoding='utf-8') as f1:
        print(f1.read())
    with open('log1', encoding='utf-8') as f1,
        open('log2',encoding='utf-8', mode='w') as f2:
        print(f1.read())
        f2.write('666')
    with open('log1', encoding='utf-8') as f1:
        content = f1.read()
        f1.close()
        pass
        with open('log1', encoding='utf-8',mode='w') as f2:
            f2.write('333')
    View Code
    文件的改:
    1,打开原文件 old_file,将原内容读取到内存。
    2,创建一个新文件new_file。
    3,将原内容通过你改写形成新内容,写入到新文件。
    4,将原文件删除。
    5,将新文件重命名成原文件。
    方法一,原文件内容不打,可以用此方法,但是此方法还是很low。
    import os
    with open('change', encoding='utf-8') as f1,
        open('change.bak', encoding='utf-8', mode='w') as f2:
        old_content = f1.read()
        new_content = old_content.replace('alex', 'SB')
        f2.write(new_content)
    os.remove('change')
    os.rename('change.bak', 'change')
    View Code
    方法2
    import os
    with open('change', encoding='utf-8') as f1,
        open('change.bak', encoding='utf-8', mode='w') as f2:
        for line in f1:
            new_line = line.replace('SB', 'alex')
            f2.write(new_line)
    os.remove('change')
    os.rename('change.bak', 'change')
    View Code

     练习题:

    1. 文件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}......] 并计算出总价钱。
    goods_info = []
    with open("a.txt",encoding="utf-8") as f:
        for line in f:
            line = line.strip().split()
            dic = {"name": line[0],"price": line[1],"amount": line[2]}
            goods_info.append(dic)
    print(goods_info)
    
    
    
    goods_info = []
    list_name = ["name", "price", "amount", 'time']
    with open("a.txt",encoding="utf-8") as f:
        for line in f:
            line = line.strip().split()
            # ['apple', '10', '3', '2016']
            dic = {}
            for i in range(len(line)):
                dic[list_name[i]] = line[i] # dic['name'] = 'apple' dic['price'] = '10'
            goods_info.append(dic)
    print(goods_info)
    sum = 0
    for i in goods_info:
        money = int(i['price']) * int(i['amount'])
        sum += money
    print(sum)
    View Code
    2,有如下文件:
    -------
    alex是老男孩python发起人,创建人。
    alex其实是人妖。
    谁说alex是sb?
    你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
    ----------
    将文件中所有的alex都替换成大写的SB。
    2,有如下文件:
    -------
    alex是老男孩python发起人,创建人。
    alex其实是人妖。
    谁说alex是sb?
    你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
    ----------
    将文件中所有的alex都替换成大写的SB。
    View Code
    
    
    3.文件a1.txt内容
    文件内容:
    name:apple price:10 amount:3 year:2012
    name:tesla price:100000 amount:1 year:2013
    
    通过代码,将其构建成这种数据类型:
    [{'name':'apple','price':10,'amount':3},
    {'name':'tesla','price':1000000,'amount':1}......]
    并计算出总价钱。
    str = """name:apple price:10 amount:3 year:2012
    name:tesla price:100000 amount:1 year:2013
    with open(r'a1.txt','w',encoding='utf-8') as write_f:
        write_f.write(str)
    
    person_list = []
    sum = 0
    
    with open(r'a1.txt','r',encoding='utf-8') as read_f:
        for lines in read_f:
            line_list = lines.strip().split()
            dic = {}
            for line in line_list:
                line = line.strip().split(":")
                dic[line[0]] = line[1]
            dic.pop('year')
            person_list.append(dic)
    
    for line in person_list:
        sum += (int(line['price']) * int(line['amount']))
    print(sum)
    View Code
    4,文件a2.txt
    文件内容:
    序号     部门      人数      平均年龄      备注
    1       python    30         26         单身狗
    2       Linux     26         30         没对象
    3       运营部     20         24         女生多
    通过代码,将其构建成这种数据类型:
    [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
    ......]
    并计算出总价钱。
    
     序号     部门      人数      平均年龄      备注
    1       python    30         26         单身狗
    2       Linux     26         30         没对象
    3       运营部     20         24         女生多
    通过代码,将其构建成这种数据类型:
    [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
    ......]
    并计算出总价钱。
    f = open('a2', encoding='utf-8')    # 以读的方式打开一个文件,获得一个文件句柄
    f1 = f.readline()  # 用文件句柄把第一行文件读取出来,将内容赋值给f1
    f1 = f1.strip().split()  # 对第一行文件内容以空格进行分割,形成一个列表赋值给f1
    li = []   # 建立一个空列表li
    for i in f:   # 循环读取文件剩下的每一行内容,将内容赋值给i
        i1 = i.strip().split()  # 对读取出来的每一行内容去除首尾空格换行符等,
        # 然后以空格进行分割,形成一个列表赋值给i1
        dic = {}    # 建立一个空字典dic
        for j in range(len(i1)):  # 循环i1列表的索引值
            dic[f1[j]] = i1[j]   # 给dic添加键值对,f1通过索引找到内容作为dic的键,
            # i1通过索引找到内容作为值,将键值对添加到dic中
        li.append(dic)  # 将dic添加到li这个列表里面
    print(li)  # 打印li
    f.close()  # 关闭文件
    View Code
     
    
    
  • 相关阅读:
    【React Native】某个页面禁用物理返回键
    【React Native】DeviceEventEmitter监听通知及带参数传值
    转载【React Native代码】手写验证码倒计时组件
    【React Native】 中设置 APP 名称、应用图标、为安卓添加启动图
    【React Native错误集】* What went wrong: Execution failed for task ':app:installDebug'.
    【React Native错误集】Import fails with "Failed to execute 'ImportScripts' on 'WorkerGlobalScope'"
    【React Native错误集】Android error “Could not get BatchedBridge, make sure your bundle is packaged properly” on start of app
    「React Native笔记」在React的 setState 中操作数组和对象的多种方法(合集)
    【React Native】Error: Attribute application@allowBackup value=(false) from AndroidManifest.xml
    坚果云如何使用二次验证码/谷歌身份验证器/两步验证/虚拟MFA?
  • 原文地址:https://www.cnblogs.com/ls13691357174/p/9096330.html
Copyright © 2020-2023  润新知