zoukankan      html  css  js  c++  java
  • 11 python初学 (文件)

    对文件的操作分为 3 步:

    1. 打开文件;
      f = open('望月怀古', 'r', encoding='utf8')   # 路径可以写绝对路径,也可以写相对路径;
    2. 操作
    3. 关闭文件; f.close()

    with 方式打开文件:使用 with 语句,当 with 代码块执行完毕之后,内部会自动关闭并释放文件资源。这样可避免打开文件后忘记关闭。

    在 python 2.7 后,with 又支持对多个文件进行上下文管理。

    with open('望月怀古', 'r', encoding='utf8') as f:
        print(f.readline())
    with open('望月怀古', 'r', encoding='utf8') as f1, open('望月怀古1', 'w', encoding='utf8') as f2:
        pass

    只读模式:r

    f = open('望月怀古', 'r', encoding='utf8')
    data = f.read(5)   # 读取 5 个字符: 1 个汉字和 1 个 英文字母都算是 1 个字符
    print(data)
    f.close()

    写模式:w。 

    # w:写操作。 在 f 对象被创建的时候就会将原来的文件清空,重新写操作。
    # 如果没有该文件,则先会自动创建一个,在进行写入
    f = open('望月怀古1', 'w', encoding='utf8')
    f.write('望月怀古')
    f.write('     张九龄')   # 会紧跟在上一句之后写入。
    f.close()

    在文件后继续添加:a

    # a:append 直接在文件后面追加
    f = open('望月怀古1', 'a', encoding='utf8')
    print(f.fileno())   # 打印文件句柄
    f.write('\nHello world')
    f.close()

    文件操作方法:

    1. readline()

    如果想要读取文件某一行的内容(如第五行),使用 linecache

    linecache是专门支持读取大文件,而且支持行式读取的函数库。 linecache预先把文件读入缓存起来,后面如果你访问该文件的话就不再从硬盘读取

    import linecache

    str = linecache.getline(filename,linenum)

    # 读取一行数据。 读取一行后,光标移动了,如果文件没有被关闭,下次会从光标处继续读
    f = open('望月怀古', 'r', encoding='utf8')
    f.readline()

    2. readlines()

    a. 可以通过 count = len(f.readlines) 来计算文件行数。但是对于大型文件不适用

    b. 大型文件:使用循环处理。 for i in f: count += 1

    c.str = linecache.getlines(filename)       str为列表形式,每一行为列表中的一个元素

    print(f.readlines())  # 读取所有行,放进一个列表中输出
    
    # readlines 读取出来的列表会被放进内存中进行保存,因此当文件很大时并不建议使用此方法。使用 for i in f,即可对每一行做输出
    f = open('望月怀古', 'r', encoding='utf8')
    # for i in f.readlines():   不建议使用
    for i in f:
        print(i.strip())
    f.close()

    3. tell() :得到当前光标位置

    f = open('望月怀古', 'r', encoding='utf8')
    print(f.tell())
    f.read(7)
    print(f.tell())
    
    >>> 0
    >>> 7
    
    # 如果是英文字符,则读取 7 个后,当前光标位置是 7
    # 如果是中文字符,读取 7 个后,当前光标位置是 21.因为一个中文占 3 个字符

    4. seek():调节当前光标位置

    #hello world
    #
    f = open('望月怀古', 'r', encoding='utf8')
    print(f.tell())
    print(f.read(7))
    print(f.tell())
    
    f.seek(0)  # 调节当前光标位置到0,从当前位置开始打印
    print(f.read(4))
    
    >>> 0
    >>> hello w
    >>> 7
    >>> hell    # 又从光标 0 的地方开始输出

     5. flush() :把缓存里的数据保存到磁盘里区

    f.flush()

    # flush 立即刷新写入。此段代码运行结果就是每隔 1 秒钟输出一个 * ,一共输出 10 个
    import sys
    import time
    for i in range(10):
        sys.stdout.write("*")
        sys.stdout.flush()
        time.sleep(1)

    6.truncate():从某个字符处开始截断,将后面内容全部删除。

    f = open('望月怀古1', 'a', encoding='utf8')
    f.truncate(7)
    f.close()
    >>> hello w

    7. fileno():得到文件描述符,返回一个整数。唯一的代表一个文件

    8. f.isatty(): 判断是不是终端

    9. f.readable(): 判断文件是不是可读的

    10 . r+、 w+、 a+

    # r+:即可读,又可以写的模式,是在 r 的基础上延伸出来的。1. 不会清空文件;2. 写的时候会在文件最后写
    # w+:既可读又可写,是在 w 的基础上延伸出来的。1. 会清空文件 2. 写入之后光标会移动到当前写入字符后,再读取就没有内容,如果需要读取写入内容,就需要调节光标位置
    # a+:既可读又可写,是在 a 的基础上延伸出来的。1. 不会清空文件 2. 光标初始默认定位在文件最后,因此需要读取时需要先调节光标位置 3. 写入时不论当前光标位置如何,都会在最后添加。
    # r+:
    f = open("望月怀古1", 'r+', encoding='utf8')
    print(f.readline())
    f.write("love you")
    f.close()
    
    #w+:
    f = open("望月怀古1", 'w+', encoding='utf8')
    print(f.readline())
    f.write("i love you")
    print(f.tell())
    f.seek(0)
    print(f.readline())
    f.close()

    #a+:
    f = open("望月怀古1", 'a+', encoding='utf8')
    f.seek(4)
    print(f.readline())
    f.write("12345")
    f.close()
     

     # 实现将 望月怀古 第 2 行后添加字符串 “lily”

    # 实现1: 此种实现的问题是,以为光标在第 2 行后面,就可以添加到正确的位置了。但是其实会添加到最后,因为就是这样的机制。
    f = open("望月怀古", "r+", encoding='utf-8')
    count = 0
    for line in f:
        count += 1
        if count == 2:
            f.write("lily")
    f.close()

    eval 函数:将字符串变回数据类型

  • 相关阅读:
    MySQL Explain学习笔记
    postman测试文件上传接口教程
    URLDecoder异常Illegal hex characters in escape (%)
    第三章 jQuery总结 参考文本
    史上最简单的一道面试题!坑人吧
    cookie和session的关联关系
    服务器配置
    Rancher 添加主机无法显示、添加主机无效的解决办法
    .NET Core 跨平台 串口通讯 ,Windows/Linux 串口通讯,flyfire.CustomSerialPort 的使用
    .Net Core 跨平台应用使用串口、串口通信 ,可能出现的问题、更简洁的实现方法
  • 原文地址:https://www.cnblogs.com/mlllily/p/10212087.html
Copyright © 2011-2022 走看看