十一.文件

1.小文件操作

# #-------------------以下只适合读小文件-----------------------
#打开当前目录下的文本文件
filename="testfile1.txt"
f=open(filename,"r",encoding="utf-8")  #文件句柄,"r表示只读(默认)
#.read()没有参数表示全部读完,将文件内容放到一个字符串变量中,字符串变量可能包含换行符
print(f.read())
print(f.read()) #上面已经读完,没有结果
f.close()

g=open(filename,"w")  #文件句柄,"w"表示重头只写(全部重新写,不是按行覆盖)
g.write("My name is ZhangYuan
")
g.close()

k=open(filename,"a")  #文件句柄,"a"表示末尾只写(尾部追加)
k.write("TEST1") #写入时如果没有加入换行号"
"则不换行
k.write("TEST2
")
k.write("TEST3
")
k.write("TEST4
")
k.close()

# f.readline()表示逐行读取
f=open(filename,"r",encoding="utf-8")
for i in range(3):
    print(i,f.readline())
f.close()

# f.readlines()全部读取,自动将文件内容按行分成一个列表
f=open(filename,"r",encoding="utf-8")
R=f.readlines()
print(R,"Finish") #['My name is ZhangYuan
', 'TEST1TEST2
', 'TEST3
', 'TEST4
'] Finish
for index,line in enumerate(R):
    print(index,line.strip()) #直接print(line)包括空格和换行,用strip()可去除
f.close()

2.大文件操作

#-------------------------以下适合大文件----------------------------------
print("以下适合大文件")
f=open(filename,"r")
#每次读取只保存一行到内存,不会累积内存
count=0
for line in f:
    print(count,line,"不积累内存")
    count+=1
f.close()

#with语句自动关闭文件,下面的方式适合大文件读取
with open("testfile1.txt","r",encoding="utf-8") as f1:
    for line in f1:
        print(line,"with语句")

#用fileinput模块读取大文件
import fileinput
for line in fileinput.input(filename):
    print(line,"fileinput模块")

3.with语句,可以自动关闭打开的文件

#with语句自动关闭文件,下面的方式适合大文件读取
with open("testfile1.txt","r",encoding="utf-8") as f1:
    for line in f1:
        print(line)

4.r+,w+,a+,二进制

#硬盘上File文件的写入都是覆盖原位置,所以不存在直接性的在指定光标位置插入,除非进一步处理
#文件先读后写(追加)
f=open(filename,"r+",encoding="utf-8")
print("first",f.readline())
print("second",f.readline())
f.write("
ABCDEFG") #在文件最后写入,不是插入
f.close()

# #文件先写后读:w+模式,会覆盖全部文件
# print("---先写后读---")
# f=open(filename,"w+",encoding="utf-8")
# f.write("
先写后读")
# print(f.readline(),"先写后读") #在最后追加,所以读取内容为空
# print(f.readline(),"先写后读") #在最后追加,所以读取内容为空
# f.close()

# #文件先追加后读:a+模式
# f=open(filename,"a+",encoding="utf-8")
# f.write("
先追加后读") #在文件最后写入,不是插入
# print(f.readline(),"a+模式") #在最后追加,所以读取内容为空
# print(f.readline(),"a+模式") #在最后追加,所以读取内容为空
# f.close()

#以二进制方式
print("---二进制---")
f=open(filename,"rb") #二进制不能传递encoding="utf-8"参数
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
g=open(filename,"ab")
g.write("
Hello World
".encode())
g.close()

5.强制刷新

#强制刷新(确认下内存或缓存中的数据已经写入硬盘,有时候写入的数据会保存到缓存,出问题就不能保存在硬盘了)
print(f.flush())
f.close()

6.其他操作

#f.tell(),f.seek()光标操作
filename="testfile1.txt"
f=open(filename,"r",encoding="utf-8")
print(f.tell()) #按字符来计数返回file读取位置---0
print(f.readline())
print(f.tell()) #按字符来计数返回file读取位置---22
f.seek(0) #光标回到0
print(f.tell()) #---0

#返回编码方式
print(f.encoding)

#截断前20个字符保留,其余删除。不输入则全部清空
# f=open(filename,"a",encoding="utf-8") #如果是"w",表示file以新文件打开,里面没有内容,截断内容只能用"a"
# f.truncate(20) #截断前20个字符保留(跟光标位置无关)
# f.close()
原文地址:https://www.cnblogs.com/i201102053/p/10651531.html