• 文件的操作


    文件操作的大纲:

    读模式:
            *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
     
    
    
  • 相关阅读:
    Python3学习笔记(十二):闭包
    Python3学习笔记(十一):函数参数详解
    PostgreSQL psql中如何查看快捷功能的对应函数
    PostgreSQL逻辑复制槽 pg_recvlogical test_decoding wal2json
    记一次内存占用过高的分析
    数据库一致性解读
    PostgreSQL常用插件收集
    PostgreSQL truncate table会释放索引的空间
    PostgreSQL锁级别及什么操作获取什么锁
    PostgreSQL设置事务隔离级别实验
  • 原文地址:https://www.cnblogs.com/ls13691357174/p/9096330.html
Copyright © 2020-2023  润新知