文件操作

encode:编码

decode:解码

 encoding="utf-8" :只手一种编码方式,并不是像encode,decode的功能一样,而"utf-8"依赖于文件是以什么方式创建的,以什么方式打开的,

如:记事本是GBK方式创建的,则打开需用GBK编码方式打开,encoding="GBK"

文件名最好以英文命名,不然会在某个环节出错,以什么编码方式存储的,就以什么编码方式打开.

路径问题:

绝对路径:从根目录开始,一级一级查找直到找到文件.eg:D:\....

相对路径:在同一个文件下(目录)直接写文件名. eg:具体的文件名

一:  读文件模式:    r  , 默认可以不写,mode="r".   读取出来都为str类型.五种模式

1.全部读出来.f.read()

f = open("log", encoding="utf-8", mode="r")   #注意 = 旁边无空格
content = f.read()
print(content)
f.close()

#全部读出来

2.读取一部分,按照字符去读取.(也可以理解为个数)  f.read(n)

 文件打开方式为文本模式时,代表读取5个字符

文件打开方式为b模式时,代表读取5个字节

f = open("log", encoding="utf-8", mode="r")   #注意 = 旁边无空格
content = f.read(5)
print(content)
f.close()
#返回:1.输入工

3.一行一行的读.f.readline().

f = open("log", encoding="utf-8", mode="r")   
print(f.readline())
print(f.readline())
print(f.readline())              #读多行             
f.close()
#返回:1.输入工资 判断是不是整数

4.一行一行的读.将原文件的每一行作为一个列表的元素.  f.readlines()

f = open("log", encoding="utf-8", mode="r")   #注意 = 旁边无空格
content = f.readlines()
print(content)
f.close()
#返回:['1.输入工资
', '判断是不是整数
', '将输入的变为int类型
', '..

5.循环读取   推荐使用的方法,因为在内存中永远只占一行

f = open("log", encoding="utf-8", mode="r")
for i in f:               # i就是每一行
    print(i.strip())      #  strip()去掉隔行符
f.close()           
#将文件全部读取出来

二.写 w 没有文件,创建一个文件写入内容,有文件,将原文件内容清空,在写入内容.(所以有弊端,容易将之前的内容清楚掉不好)

f = open("log", encoding="utf-8", mode="w")
f.write("今天开班会")
f.close()
返回:在log文件夹内就可以找到写进去的内容

三,读写模式:   r+ 先读,后追加,一定要先读后追加

f = open("log", encoding="utf-8", mode="r+")
content = f.read()       #比如之前文件里的内容为:今天开班会
f.write("AAA")           #读完之后再写入AAA
print(content)           #最后再打印
f.close()
with open("log1", encoding="utf-8", mode="r+")as f:
    content = f.read()
    f.write("AAA")
    f.read()
    print(content)

四,写读模式  w+ 先写后读

f = open("log", encoding="utf-8", mode="w+")
f.write("中国")
print(f.read())
print(f.tell())             #按照字节去读光标的位置
f.seek(3)                   #按照字节调整光标位置
print(f.read())
f.close()
#返回:6  国

其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate

seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

 

with open("log1", encoding="utf-8", mode="w+")as f2:
    f2.write("今天在家学习")
    f2.tell()
    f2.seek(6)
    print(f2.read())

五.追加 a 没有文件创建一个文件追加内容,有文件直接追加内容.

f = open("log1", encoding="utf-8", mode="a")
f.write("666") #创建一个新的以log1命名的新文件,内容为666
f.close()

六.以bytes类型,进行的读, 写,文件操作以bytes类型写入就需转成bytes类型后再写入.非文件的文件是用rb读取,什么是非文件比如视频,图片.

只举一种写的例子:

f = open("log", mode="wb")
f.write("老男孩".encode("utf-8"))        #中文的字符串转换成bytes类型,就需encode(utf-8),转换一下

f.close() #返回:在文件夹log中,写入了老男孩

七.其他方法:truncate   按字节对原文件截取.

一,truncate是截断文件,所以文件的打开方式必须可读,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
f = open("log1", encoding="utf-8", mode="a")
f.truncate(2)
f.close()

二,自动关闭文件句柄  with open

#功能一,省去自动关闭文件句柄
with open("log1",encoding="utf-8",mode="r") as f: #
    print(f.read())
#功能二,省去自动关闭文件句柄,利用一个位置去操作多个文件句柄
with open("log1", encoding="utf-8", mode="r") as f1,
     open("log2", encoding="utf-8", mode="w") as f2:
    print(f1.read())
    print(f2.write("hahhah"))        #可以用任意模式去操作.可以r,w.a

 

八,文件修改,实际操作

1.将源文件读取到内存

2.在内存中进行修改,形成新的字符串(文件 )

3.将新的字符串写入新文件

4.将原文件删除

5.将新文件重命名成原文件

 例题:有如下文件:

-------

alex是老男孩python发起人,创建人。

alex其实是人妖。

谁说alex是sb?

你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。

----------

将文件中所有的alex都替换成大写的nb。

import os     #引用模块

with open("log1", encoding="utf-8", mode="r") as f,              #以读模式打开原文件
    open("log1.back", encoding="utf-8", mode="w") as f2:  #以写的模式打开log1.back文件
    content = f.read()         #将读的文件赋给一个变量,不能每次都写f.read()
    new_content = content.replace("alex", "nb") #通过旧文件用replcae方法将alex修改为nb,赋值给新的文件
    f2.write(new_content)           #将新的写入f2中,即log1.back的文件中

os.remove("log1")#将原来的文件(log1)删除
os.rename("log1.back", "log1")  #重新命名为log1

#但求理解,即使是初级版本,也必须是要理解的.
高级版本写法:
import os

with open("log1", encoding="utf-8", mode="r") as f,
    open("log1.back", encoding="utf-8", mode="w") as f2:
    for i in f:
        new_i = i.replace("nb", "alex")
        f2.write(new_i) #这里不能加引号,加引号就是写进去单个字符串,而不是将修改过后的文件new_i写进去

os.remove("log1")
os.rename("log1.back", "log1")

 

原文地址:https://www.cnblogs.com/sunny7/p/8878907.html