• Python学习---文件操作的学习1208


    1.1. 对文件操作基本操作

    操作流程:

        打开文件,得到文件句柄并赋值给一个变量

        通过句柄对文件进行操作

        关闭文件

    注意pyton中操作的文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要f=open('hello',encoding='utf8'),hello文件如果是gbk保存的,则直接打开即可。

    简单的文件介绍

    文件一旦定义,就不能修改,只能是重新写入新的文件/覆盖

    with open('hhh.txt', 'r') as f:
        print(f.read()) #  UnicodeDecodeError: 'gbk' codec can't decode byte 0x98 in position 66: illegal multibyte sequence
    # 中文是GBK,不能直接转换为bytes,所以报错[Py3中只有bytes和str,所以转换不了bytes,也就转换不了unicode,需要说明的是unicode向下兼容utf-8]
    # 打开文件流,以读写的方式  【错误的】
    f = open('hhh', 'rw', encoding='utf-8')

    image

    附文件操作模式:

    注意: w+模式任然会清空文件内容

    读的时候永远从光标0开始, 写的时候永远都是从最后开始写,文件不能修改,但是可以复制文件到新的文件里面进行操作【基于内存本来的机制限制】

    image

    image

    打开文件流,以w+方式

    # 打开文件流,以w+方式
    f = open('hhh', 'w+', encoding='utf-8')
    # 文件操作,直接操作文件,Python会自动将for作为一个迭代器来输出,用一个选择一个来输出
    f.write("how are you")    # 写之前清空文件
    f.flush()
    # f.seek(0)               # 写完后光标移动到文件尾部,所以读取不到文件                  
    print(f.read())
    # 关闭文件流
    f.close()

    文件的读操作

    只能以一种模式打开  r/w/a/x/t/+   具体参见上图

    输出的时候,python里面的光标也会跟着print同步转移,下一次print会打印下一行

    # version: python3.2.5
    # author: ‘FTL1012
    # time: 2017/12/8 12:16
    
    # 打开文件流,以读的方式
    f = open('hhh', 'r', encoding='utf-8')
     print(f.read(1))           # 打印一个字符
     print(f.readline())        # 读取一行
    # print(f.readline(5))        # 读取一行中的前5个字符
    # print(f.readlines())        # 多行读取,并组成一个列表
    # 打印全部文字/字符
    file = f.read()
    print(file)
    # 关闭文件流
    f.close()

    image

    注意:readlines()读取会返回一个列表,for循环打印的时候,会读取到文本后的换行符,默认会打印出来

    f = open('hhh', 'r', encoding='utf-8')
    for i in f.readlines():
        print(i.strip())         # 默认会打印出来后面的换行符,所以在这里进行了过滤
    # 关闭文件流
    f.close()

    另:# 在特定的行添加 I love U

    方案一:直接读取列表
    # print(f.readlines()[1].strip()+'I love U')
    # print(''.join((f.readlines()[1].strip()+'I love U')))
    方案二:自定义变量
    # 打开文件流,以读的方式
    f = open('hhh', 'r', encoding='utf-8')
    # 读取文件
    date = f.readlines()
    # 关闭文件流
    f.close()           # 读取出来列表后,关闭文件,继续在内存中操作,不影响后面读取文件,效率高
    num = 0
    for i in date:
        num += 1
        if num == 2:
            print(i.strip(),'	 I love U')
        else:
            print(i.strip())
    方案三: enumerate添加序列
    # 打开文件流,以读的方式
    f = open('hhh', 'r', encoding='utf-8')
    # 文件操作,仅仅作输出显示用
    for i, v in enumerate(f.readlines()):
        if i == 1:
            v = ''.join([v.strip(), ' I love U'])
        print(i, v.strip())
    # 关闭文件流
    f.close()
    方案四: 仅仅作输出显示用
    # 打开文件流,以追加写的方式
    f = open('hhh', 'r+', encoding='utf-8')
    num = 0
    for line in f:
        num += 1
        if num == 3:
            line = ''.join([line.strip(), ' hello'])
        print(line.strip())
    # 关闭文件流
    f.close()

    文件的写入:

    【没有文件,会创建文件,文件存在会清空原来的内容,重新写入】

    # 打开文件流,以写的方式 
    f = open('hello', 'w', encoding='utf-8')
    # 写内容进文件
    file = f.write("hello world 2017")
    # 关闭文件流
    f.close()

    image

    文件的追加写入,默认在结尾直接追加,紧贴着原来

    # 打开文件流,以追加的方式  
    f = open('hello', 'a', encoding='utf-8')
    # 写内容进文件
    f.write("
    黄山百战穿金甲,不破楼兰终不还
    ")  # 这里增加了换行
    黄山
    f.write("夜阑卧听风吹雨,铁马冰河入梦来
    ")
    f.write("--2017-12-08".rjust(38, ' '))  # 增加了向右边增加空格的操作
    # 关闭文件流
    f.close()
    image

    文件的其他操作:


    tell(): 查找光标, 英文字母读一个光标移动一次,中文读一个字符光标移动3个位置

    tell读取英文:

    # 打开文件流,以读的方式
    f = open('hhh', 'r', encoding='utf-8')
    # 文件操作,直接操作文件,Python会自动将for作为一个迭代器来输出,用一个选择一个来输出
    print(f.tell())
    print(f.read(3))
    print(f.tell())
    # 关闭文件流
    f.close()

    image

    tell()读取:记录光标的位置

    # 打开文件流,以读的方式
    f = open('hhh', 'r', encoding='utf-8')
    # 文件操作,直接操作文件,Python会自动将for作为一个迭代器来输出,用一个选择一个来输出
    print(f.tell())
    print(f.read(3))
    print(f.tell())
    # 关闭文件流
    f.close()

    image

    文件的seek()操作:调整光标的位置,一般用于文件的断点传播,迅雷下载

    # 打开文件流,以读的方式
    f = open('hhh', 'r', encoding='utf-8')
    # 文件操作,直接操作文件,Python会自动将for作为一个迭代器来输出,用一个选择一个来输出
    print("调整前:", f.tell())
    print(f.read(3))
    print(f.tell())
    f.seek(0)
    print("调整后:", f.tell())
    print(f.read(3))
    print(f.tell())
    # 关闭文件流
    f.close()
    image

    文件的flush()操作:将缓存中的数据写入到硬盘

    文件的flush()应用:打印进度条

    import sys, time
    for i in range(30):
        # sys.stdout 相当于f对象
        sys.stdout.write('.')
        # 如果不添加flush(),则会等到30秒之后,一起打印出来30个dian
        sys.stdout.flush()
        time.sleep(1)
    

    文件的truncate(): 文件的阶段,默认从头开始截取全部,相当于删除文件内容

    适用于append模式,因为w模式默认会先truncate()

    不常用

    文件的fileno():返回一个整数,代表文件描述符,在内存中唯一的

    文件的isatty ():判断文件是否是终端

    文件选优操作

    [推荐]文件的迭代输出:不再内存中操作文件,用一个从硬盘读取一行[默认输出一行],用完就结束

    小文件,相比较readlines效率低一点,因为有一个转换的过程。大文件有优势,不占用内存

    解释:readlines会将整个的文件读取到内存中,但是相对于10G等大文件,内存吃不消,所以建议文件读的时候,用for提供迭代器输出,用一行读取一行到内存,用完就释放内存。

    文件的迭代输出

    # 打开文件流,以读的方式
    f = open('hhh', 'r', encoding='utf-8')
    # 直接操作文件,Python会自动将f对象作为一个迭代器来输出,用一个选择一个来输出
    for i in f:
        print(i.strip())
    # 关闭文件流
    f.close()

    文件操作之修改磁盘文件:

    # 在第二行添加一句 Hello 2017
    f_read = open('hhh', 'r', encoding='utf-8')
    f_write = open('hhh_2', 'a+', encoding='utf-8')
    num = 0
    for i in f_read:
        num += 1
        if num == 2:
            i = ''.join([i.strip(), '	 Hello 2017'])
        f_write.write(i.strip()+'
    ')
        f_write.flush()
    f_read.close()
    f_write.close()

    with语句

    with语句为了避免打开文件后忘记关闭,可以通过管理上下文,当with代码块执行完毕时,内部会自动关闭并释放文件资源。【在Python 2.7 后,with又支持同时对多个文件的上下文进行管理】

    with open('hhh', 'r', encoding='utf-8') as f1, open('hhh_2', 'r', encoding='utf-8') as f2:
        print(f1.read())
        print("----------------------------------")
        print(f2.read()) 
       # python会自动关闭释放内存

    image

    字典的文件读取:

    dic = str({'name':'hhh', 'age':23})
    
    with open('hhh', 'r', encoding='utf-8') as f:
        # f.write(dic)
        date = f.read()
        print(eval(date)['age'])
        print(eval(date)['name'])

    三级菜单升级版[增加文件+增删改]

    1. 展示省市区(数据在文件中)

    2. 可以增加新的省份,文件会更新

    【三级菜单参考】

    Python实例---三级菜单的实现[low]

    Python实例---三级菜单的实现[high]

  • 相关阅读:
    Hive快速入门
    Spark Standalone 提交模式
    Spark WordCount 文档词频计数
    Spark Shuffle原理分析及性能优化
    Spark性能问题分析及优化【OOM、Stack Overflow】
    Redis常用命令【列表】
    Redis常用命令【字符串】
    Nosql数据库分类
    Redis内存数据库快速入门
    Scrapy实现腾讯招聘网信息爬取【Python】
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9382434.html
Copyright © 2020-2023  润新知