python(open 文件)

一、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()

#写入后内容
"""
秦时明月汉时关
万里长征人未还
--王力宏
"""

原文地址:https://www.cnblogs.com/ZhengYing0813/p/11734995.html