一、open 文件
1.open('file','mode')打开一个文件
- file 要打开的文件名,需加路径(除非是在当前目录)
- mode 文件打开的模式
- 需要手动关闭 close
2.with open('file','mode')as...
- 不需要手动关闭文件
二、文件操作模式
1.'r': 以只读模式打开(默认)(必须保证文件存在)
- python2.x 文件名中出现汉字时,需在括号内加 u 就不会出现报错IOError
#python2.x file1 = open(u"D:新方硕.txt","r",encoding="gbk") print file1.read() file1.close() #python3.x file1 = open("D:新方硕.txt","r",encoding="gbk") #文件内中文为手动输入,则需转码 print (file1.read().decode('gbk').encode('utf-8')) file1.close()
- read(size) 读取所有
- 返回字符串
- 括号接读取 size 字符
#read()不传参数时默认读取所有 f = open("D:work_docCodeFileStudy\filename") print(f.read()) f.close() #结果如下: """ 这缘分 像一道桥 旌旗飘啊飘 你想走 就请立马抽刀 爱一笔勾销 """ #read(3)括号内参数3代表字符数,1个汉字1个字符 f = open("D:work_docCodeFileStudy\filename") print(f.read(3)) f.close() #结果如下: """ 这缘分 """
#文件内容如下 """ 这缘分 像一道桥 旌旗飘啊飘 你想走 就请立马抽刀 爱一笔勾销 """ f = open("D:work_docCodeFileStudy\filename","r",encoding="gbk") print(f.read(3)) #读取完这行后,操作光标已经在第一行末尾了 print(f.read(3),end="") #所以接下来再次读取会读取第二行数据 f.close() #读取结果如下 """ 这缘分 像一 """
- readline(size)默认读取一行
- 返回字符串
- 括号内 size 为读取的子符数
#readline()默认读取一行 file1 = open("D:新方硕.txt","r") print (file1.readline()) file1.close() #readline(size)括号内填了字符数,则按字符读取 file1 = open("D:新方硕.txt","r") print (file1.readline(5)) file1.close()
#文件内容如下 """ 这缘分 像一道桥 旌旗飘啊飘 你想走 就请立马抽刀 爱一笔勾销 """ f = open("D:work_docCodeFileStudy\filename","r",encoding="gbk") print(f.readline(),end="") #读取完这行后,操作光标已经在第一行末尾了 print(f.readline(),end="") #所以接下来再次读取会读取第二行数据 f.close() #读取结果如下 """ 这缘分 像一道桥 旌旗飘啊飘 """
- readlines()读取所有
- 返回列表
file1 = open("D:新方硕.txt","r") print (str(file1.readlines()).decode('string_escape')) #转码问题 file1.close()
with open('d:\test1.txt','r') as file1: for i in file1.readlines(): print (i)
#去掉打印出来的换行符 #方法一 f = open("D:work_docCodeFileStudy\filename","r",encoding="gbk") data = f.readlines() for i in data: print(i.strip()) f.close() #方法二 f = open("D:work_docCodeFileStudy\filename","r",encoding="gbk") data = f.readlines() for i in data: print(i.splitlines()[0]) f.close()
#文件内容如下 """ 这缘分 像一道桥 旌旗飘啊飘 你想走 就请立马抽刀 爱一笔勾销 """ #对返回的结果中某一行进行处理操作 f = open("D:work_docCodeFileStudy\filename","r",encoding="gbk") data = f.readlines() line = 0 for i in data: line += 1 if line == 4: i = " --".join([i.strip(),"王力宏"]) #往第四行后面添加 "王力宏" 字符串 print(i.strip()) f.close() #返回结果如下 """ 这缘分 像一道桥 旌旗飘啊飘 你想走 就请立马抽刀 爱一笔勾销 --王力宏 """
- 最优读取文件方法,不占内存
#文件内容如下 """ 这缘分 像一道桥 旌旗飘啊飘 你想走 就请立马抽刀 爱一笔勾销 """ f = open("D:work_docCodeFileStudy\filename","r",encoding="gbk") for i in f: #for循环内部将 f 对象做出了一个迭代器,用一行数据取一行数据,用完后(print)的数据删除,不占内存空间 print(i.strip()) f.close() #返回结果如下 """ 这缘分 像一道桥 旌旗飘啊飘 你想走 就请立马抽刀 爱一笔勾销 """
备注:
- 调用
read()和readlines()
会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)
方法,每次最多读取 size 个字节的内容。另外,调用readline()
可以每次读取一行内容。 - 如果文件很小,
read()
一次性读取最方便;如果不能确定文件大小,反复调用read(size)
比较保险;如果是配置文件,调用readlines()
最方便。
2.'w':以只写模式打开
- 若文件存在,则会自动清空文件,然后重新创建。
- 若文件不存在,则新建文件。
- 使用这个模式必须要保证文件所在目录存在,文件可以不存在。
file1 = open("D:\xfs.txt","w") file1.write("I am python!") file1.close()
#将test文件内容复制到test1中 file1 = open('d:\test.txt','r') file2 = open('d:\test1.txt','w') file3 = file2.write(file1.read()) file1.close() file2.close()
with open('d:\test.txt','w') as file1: file2 = file1.write('缘分一道桥 歌词 男: 秦时明月汉时关 万里长征人未还 但使龙城飞将在 不教胡马度阴山 女: 狼烟千里乱葬岗 ' '乱世孤魂无人访 无言苍天笔墨寒 笔刀春秋以血偿 男: 谈爱恨 不能潦草 战鼓敲啊敲 用信任 立下誓言我来熬 ' '女: 这缘份 像一道桥 旌旗飘啊飘 你想走就请立马抽刀爱一笔勾销 合: 谈爱恨 不能潦草 红尘烧啊烧 以生死 ' '无愧证明谁重要 女: 这缘份 像一道桥 故事瞧一瞧 男: 走天涯你我卸下战袍 合: 梦回长城谣')
- 该模式下不能使用 read*() 方法。
#报错IOError: File not open for reading file1 = open("D:\xfs.txt","w") file1.write("I am python!") print (file1.read())
3.'a':以追加模式打开
- 若文件存在,则会追加到文件的末尾。
- 若文件不存在,则新建文件。
- 该模式不能使用 read*() 方法。
#写入前文件内容如下 """ 这缘分 像一道桥 旌旗飘啊飘 你想走 就请立马抽刀 爱一笔勾销 """ #进行追加写入操作 f = open("D:work_docCodeFileStudy\filename","a") f.write(" --王力宏") f.close() #写入后文件内容如下 """ 这缘分 像一道桥 旌旗飘啊飘 你想走 就请立马抽刀 爱一笔勾销 --王力宏 """
4.'r+': 以文本读写模式打开
- 可以写到文件任何位置。
- 默认写的指针开始指在文件开头, 因此会覆写。
- 可以使用 read*()
file1 = open(u"D:\新方硕.txt","r+") file1.seek(3) file1.write("HTML") file1.close() #默认从第一个子节开始覆写 file1 = open(u"D:\新方硕.txt","r+") file1.seek(3) file1.write("HTML") file1.close()
5.'w+': 以文本读写模式打开(打开前文件会被清空)
- 文件不存在时,写入会自动创建文件
f = open("music","w+",encoding="utf8") f.write("秦时明月汉时关 ") f.write("万里长征人未还 ") f.write("但使龙城飞将在 ") f.write("不教胡马度阴山") f.close() #结果如下 """ 秦时明月汉时关 万里长征人未还 但使龙城飞将在 不教胡马度阴山 """
6.'a+': 以文本读写模式打开(写只能写在文件末尾)
#写入前文件内容如下 """ 秦时明月汉时关 万里长征人未还 """ f = open("music","a+",encoding="utf8") f.write(" --王力宏") f.close() #写入后内容 """ 秦时明月汉时关 万里长征人未还 --王力宏 """