zoukankan      html  css  js  c++  java
  • Python day nine

     文件是一个十分重要的操作,在linux中有句话叫万物皆文件。这个就反应了文件的重要性,在python中文件的操作也是十分重要的。那么如何打开文件并读取文件的呢?这里是用是一个特殊语法。首先需要申请一个句柄,句柄也可以说是指针就是一个指向文件对象的指针。那么是如何定义的呢?

      

    f = open('沁园春', 'r', encoding='utf8') 

      这个是一个简单的句柄,它的组成可以看成是f也就是保存句柄的变量,open函数也就是打开后面的文件。在第一个参数中也就是文件的名字,这可以用绝对路径也可以用相对路径,为了方便这里直接绝对路径,并定义在本程序向同级的目录下。第二个参数也就是read模式也就是能够读取文件,相对的来说也就无法再文件中写入文件了。第三个是编码格式,在python中是默认的utf-8这里就是啦。

      然后有了这样一个句柄该怎么操作呢,这里就是f变量,或者说一个句柄对象它的函数有哪些呢。这里简单的提到一些,首先是f.read()函数,这个函数就是读取字符,并返回。

    date = f.read(22)  
    print(date)

      里面的参数是读取字符串的长度,默认是一个。可以自己添加,在这里又要提到字符的编码啦。在python中是占用三位的,字母就是占用1位的。

       在使用完句柄后一定要关闭,关闭也就是f.close,虽然python是会帮我们自动关闭的,但是自己掌控肯定是更好的。

    f.close()  # 一定需要关闭

      然后就是写模式了,这里与读模式基本类似,但是就是将句柄中的r改成w 

    f = open('沁园春', 'w', encoding='utf8')

      写模式有一个特点的,写不是在文件的最后进行写,而是在文件的最末尾。这种性质等下还会提到。 

    f.write('hello world')

      为了使能够在文件的最后添加,而不是将其中的内容覆盖再写,我们使用的是a模式也就是append追加模式,在这种模式下我们就能够将文件的内容写在最后面啦..

    f = open('沁园春2', 'a', encoding='utf8') 
    f.write('
    and you?')
    f.write('
     hello kit')
    f.close()

     对于句柄还有其他的函数,这里常用的有readline(),reeadlines(),seek(),tell(),truncate()等

    # _author:"Isaac_hu"
    # data: 2018/3/5
    
    # f = open('沁园春', 'a', encoding='utf8')  # windows自带是gbk编码,要改为utf-8
    # print(f.readline())  # 句柄 可以看成是指针,它在做操作后就会不断将指针移动到下一个位置
    # print(f.readline())
    
    # print(f.readlines())  # 将所有的内容分成列表,里面有所有行的字符串,这个会很占内存
    # data = f.readlines()  # 这样可以节省使用这个打开文件是时间
    # f.close()
    # for i in data:  # 若过读完了,那么就不能再进入循环了。所以要注释掉上面的
    #     if i == data[5]:
    #         i = ''.join([data[5].strip(), 'I like it'])
    #     print(i.strip())  # 用于去掉字符串中的换行
    
    # for i in f:  # 这里是for内部,将f对象做成迭代器,用一行去一行
    #     # 若是readlines是将读取的值直接copy到内存中,但是是迭代器的时候,只会调用你要用的内容到内存中
    #     print(i.strip())
    # f.close()
    # f.read(4)
    # print(f.tell())  # 用于指示指针,在的位置。英文是一个单词就是字符,汉字一个字就是三个字符
    #
    #
    # f.seek(0)  # 调整光标的位置。
    # print(f.read(4))
    # f.close()
    # import sys, time
    # for i in range(30):
    #     sys.stdout.write("*")  # flush 是用于从缓存区写到文件中
    #     sys.stdout.flush()  # == print("*",end = '',flush = True)
    #     time.sleep(0.2)
    # f.truncate(6)  # 默认是在最开始的位置截断,w环境下意义不大,在a下才有意义
    # f.close()
    
    # r+ , w+ , a+
    # f = open('沁园春', 'r+', encoding='utf8')  # 读写模式
    # print(f.read())
    # f.write('毛主席')  # 这样会直接跟在文件的最后面
    # f.close()
    
    # f = open('沁园春', 'w+', encoding='utf8')  # 写读模式
    # f.write('毛主席')  # 在写后会将光标移动到写的最后
    # f.seek(0)  # 要将光标移动到最前面才能读取到
    # print(f.readline())
    # print(f.tell())
    # f.close()
    
    f = open('沁园春', 'a+', encoding='utf8')  # 追加读
    f.write('毛主席')  # 本来就在最后面,写也是写在最后面
    f.seek(0)  # 要将光标移动到最前面才能读取到内容
    print(f.readline())
    print(f.tell())
    f.close()

      还有一个问题,也就是如何解决在指定行添加内容的问题,这里的解决方法是覆盖文件:

    # _author:"Isaac_hu"
    # data: 2018/3/5
    
    f = open('沁园春', 'r', encoding='utf8')
    f1 = open('沁园春1', 'a', encoding='utf8')
    number = 0
    for line in f:
        number += 1
        if number == 6:
            line = ''.join([line.strip(), 'hello isaac
    '])
        f1.write(line)
    f1.close()
    f.close()
    # 应为在磁盘中的位置已经写死了,因此write一直会在最后,所以只能添加一个新的文件,重新写这个文件,只能覆盖,不能修改
  • 相关阅读:
    菜鸟二三事
    访问 IIS 元数据库失败的问题(转)
    SQL Server 2005/2008还原数据库时遇到的问题(转)
    ME54N审批、撤批触发增强点:ME_RE…
    南通网站建设整理:最新搜索引擎登录口保证都可以用
    调试mvc的源代码
    c#委托(delegate)揭秘
    ASP.NET 应用程序生命周期概述
    JavaScript Array(数组)对象
    jQuery.each
  • 原文地址:https://www.cnblogs.com/isaac-hu/p/8511927.html
Copyright © 2011-2022 走看看