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")
原文地址:https://www.cnblogs.com/ahliucong/p/9156168.html