• python文件的操作


    今天主要内容

    1. 初识⽂文件操作
    2. 只读(r, rb)
    3. 只写(w, wb)
    4. 追加(a, ab)
    5. r+读写
    6. w+写读
    7. a+写读(追加写读)
    8. 其他操作⽅方法
    9. ⽂文件的修改以及另⼀一种打开⽂文件句句柄的⽅方式

    1. 初识⽂文件操作

    使⽤用python来读写⽂文件是⾮非常简单的操作. 我们使⽤用open()函数来打开⼀一个⽂文件, 获取到⽂文
    件句句柄. 然后通过⽂文件句句柄就可以进⾏行行各种各样的操作了了. 根据打开⽅方式的不同能够执⾏行行的操
    作也会有相应的差异.
    打开⽂文件的⽅方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤用的是r(只读)模式

    2.只读(r,rb)

    只读文件的格式为

    f = open("文件名",mode="r",encoding="utf-8")

    content = f.read()

    print(content)

    f.close()

    示例如下:

    f = open("1.txt",mode="r",encoding="utf-8")
    content= f.read()
    print(content)
    f.close()

    这里的encoding表示编码集,通过这个编码集来打开文件.

    只读文件还可以通过bytes格式打开文件,如下

    这里注意一个就是通过rb来打开文件时,就不要加encoding编码的.否则会报错的.

    f = open("1.txt",mode="rb")
    content= f.read()
    print(content)
    f.close()
    
    
    """
    运行结果如下:
    b'12345
    abc
    kl
    kr4
    '
    """

    3. 只写(w, wb)

    只写就是对于只写打开的文件,只能以写来操作,不能读和追加.

    同时要注意,只写是先删除之前的文件,然后再写.或者如果本地没有这个文件,只写会创键新的文件的.

    示例如下:

    f = open("1.txt",mode="w",encoding="utf-8")
    f.write("今天的阳光很好")
    f.close()

    关于wb的问题

    如果对文件以wb来写的话,注意可以不用加encoding了,但是写的时候要转成bytes类型再写.比如下面这样的

    f.write("stre".encode("utf-8"))

    示例:

    f = open("1.txt",mode="wb")
    f.write("我的最爱".encode("utf-8"))
    f.close()

    4. 追加(a, ab)

    追加是在文件尾追加内容,不能读,

    示例如下:

    f = open("1.txt",mode= "a",encoding="utf-8")
    f.write("是什么")
    f.close()

    5. r+读写

    最重要的方法,必须是先读,然后再写.要不然的话,会覆盖掉文件内容.(除非用seek())

    示例:

    f =open("1.txt","r+",encoding="utf-8")
    content = f.read()
    print(content)
    f.write("我也不知道")
    f.flush()
    f.close()

    6. w+写读

    写读是先写后读,先把之前的文件清空,然后再写,写完再读,但是读的是空的.另外,即使先读后写,一样读的是写的.因为一旦以写打开文件,文件内容就已经被清空了.....

    示例

    f = open("1.txt",mode="w+",encoding="utf-8")
    content = f.read()
    print(content)
    f.write("132")
    f.close()

    7. a+写读(追加写读)

    a+模式下, 不论先读还是后读. 都是读取不到数据的.因为文件一打开光标就在文件末尾的.

    示例

    f = open("1.txt",mode="a+",encoding="utf-8")
    content = f.read()
    f.write("马化腾")
    print(content)

    绝对路径和相对路径

    绝对路径是指从磁盘根目录开始的路径.

    相对路径是指相对本文件的路径 

    示例

    f = open("./test/2.txt",mode="r+",encoding="utf-8")
    f.write("你试一下")
    f.seek(0)
    print(f.read())
    f.flush()
    f.close()

     

    8. 其他操作⽅方法

    read()这个是读取所有文件的内容的方法,弊端就是是对内存压力比较大.不建议使用.

    示例如下:

    f = open("1.txt",mode = "r+",encoding= "utf-8")
    content= f.read()
    f.flush()
    print(content)
    f.close()

     read(n)这个是读取几个字符,如果连续使用的话,不是从一开始读取的,而是接着上面一个读取的.并且如果是rb模式的话,这个n就是字节数了.

    示例:

    f = open("1.txt",mode= "r+b")
    content= f.read(6)
    print(content)
    f.flush()
    f.close()

    readline()

    这个是一次读取文件的一行.这个要注意的是readline()每次读取时最后都有一个换行符,如果不想多一行空格,可以用strip()来去除.

    示例

    f = open("1.txt",mode="r+",encoding="utf-8")
    for line in f:
        print(line.strip())

    readlines()

    将每⼀一⾏行行形成⼀一个元素, 放到⼀一个列列表中. 将所有的内容都读取出来. 所以
    也是. 容易易出现内存崩溃的问题.不推荐使⽤用

    示例:

    f = open("1.txt",mode="r+",encoding="utf-8")
    lst = f.readlines()
    for line in lst:
        print(line.strip())

    推荐读取文件内容的方法,循环读取

    f = open("1.txt",mode="r+",encoding="utf-8")
    for line in f:
        print(line.strip())

    seek  和tell以及truncate()

    seek(n)是把光标移动到具体的byte上,也就是说移动的是字节数.意味着中文是移动了三个字节的倍数.

    另外有几个节点是需要记住的,seek(0)移到开始,seek(0,2)移到结尾.

    具体的意思就是0是偏移量,第二个位置的0,1,2分别代表,开始,当前位置.和结尾.

    示例如下:

    f = open("1.txt",mode="r+",encoding="utf-8")
    print(f.read())
    f.seek(0)
    
    print(f.read())

    f.tell()获取光标当前位置,

    这个值可以获取到,然后打印出来.

    示例如下:

    f = open("1.txt",mode="r+",encoding="utf-8")
    print(f.read())
    f.seek(0)
    print(f.tell())
    
    print(f.read())

    3. truncate() 截断⽂文件

    如果只是调用f. truncate() 这个方法的话,那么就是截取光标前面的内容,后面的内容都不要了.

    示例

    f = open("1.txt",mode="r+",encoding="utf-8")
    f.seek(9)
    p = f.tell()
    print(f.read())
    f.seek(p)
    f.truncate()
    f.close()

    如果是方法里面传参了,那么

    f. truncate(6)表示截取开始到第6个字节的内容.

    示例:

    f = open("1.txt",mode="r+",encoding="utf-8")
    f.truncate(6)   #截取两个汉字
    f.close()

    所以如果想做截断操作. 记住了了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进⾏行行截断
    关于truncate(n), 如果给出了了n. 则从开头开头进⾏行行截断, 如果不给n, 则从当前位置截断. 后⾯面
    的内容将会被删除

    深坑请注意

    当在r+的模式下,当只是read(n)后,我调用write,仍然是从结尾开始写.

    测试代码如下:

    f = open("1.txt",mode="r+",encoding="utf-8")
    f.read(6)
    f.write("年后")
    f.close()

    另一种写的方式:

    with open("文件",mode="",encoding="utf-8") as f:

      f.read()

    如果打开两个文件

    with open("文件1",mode="r+",encoding="utf-8") as f,

      open("文件2",mode="r+",encoding="utf-8") as f2:

      f.read()

    文件的修改:

    文件修改的逻辑是先读取文件,然后把读取的内容做修改存入另一个新文件,把老文件删除,把新文件名更改为老文件名

    示例如下:

    import os
    with open("1.txt",mode="r",encoding="utf-8") as f ,
        open("2.txt",mode="w",encoding="utf-8") as f1:
        for line in f :
            line = line.strip().replace("年后","年前")
            f1.write(line)
    
    os.remove("1.txt")
    os.rename("2.txt","1.txt")
  • 相关阅读:
    201871010107公海瑜《面向对象程序设计(java)》第十三周学习总结 公海瑜
    201871010107公海瑜《面向对象程序设计(java)》第67周学习总结 公海瑜
    《2019面向对象程序设计(Java)课程学习进度条》 公海瑜
    201871010107公海瑜《面向对象程序设计(java)》第二周学习总结 公海瑜
    201871010107公海瑜《面向对象程序设计(java)》第十二周学习总结 公海瑜
    201871010107公海瑜《面向对象程序设计(Java)》第四周学习总结 公海瑜
    201871010107公海瑜《面向对象程序设计(java)》第十一周学习总结 公海瑜
    201871010107公海瑜《面向对象程序设计(java)》第十周学习总结 公海瑜
    警告:[SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:strut2demo' did not find a matching property.
    IOException while loading persisted sessions: java.io.EOFException
  • 原文地址:https://www.cnblogs.com/ahliucong/p/9156168.html
Copyright © 2020-2023  润新知