零基础学python编程思维(四) | 读写文件

这一部分的总结没有按照Datawhale的【PythonThinking】课程来,主要参考了这篇blog

以下为正文内容:

打开文件

用python打开文件时,r表示以只读方式打开文件,文件的指针将会放在文件的开头(这是默认模式),若文件不存在则报错:

f = open(r"C:\Users\Wings\.spyder-py3\故意杀人.txt", "r", encoding="utf-8")
data = f.read()
print(data[:235])

当再次执行上述代码时,python并不会打印出同样的结果:

data1 = f.read()
print(data1[:235])   #再次执行时就不再显示读取结果

这是因为操作这个“文件句柄”的read()方法去读取文件时,句柄会从文件的开头位置移动到文件的结束位置,如果不做任何操作,读取完毕后句柄就会停止在结束位置。因此再次读取文件时,该句柄是从结束位置往后面读取内容,由于后面没有任何内容,因此第二次读取为空。

写入文件

w表示打开一个文件只用于写入,如果该文件不存在,创建新文件;如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被覆盖:

f = open(r"C:\Users\Wings\.spyder-py3\read0.txt", "w", encoding="utf-8")
f.write("加一颗奶球")
#此时打开该文件,并不会看到相应文本内容
f.close()     #现在文档中才会出现内容

r+模式

r+表示打开一个文件用于读写,当文件不存在时报错,文件指针将会放在文件的开头,写入内容后文件句柄放在写入内容的最后面。

#只读取文件内容
f = open(r"C:\Users\Wings\.spyder-py3\read0.txt", "r+", encoding="utf-8")
data = f.read()
print(data)
f.close()

#在文件中写入内容后立即读取
f = open(r"C:\Users\Wings\.spyder-py3\read0.txt", "r+", encoding="utf-8")
f.write("抬头看见星星在唱歌")
data = f.read()
print(data)     #无法显示内容
f.close()

#在文件中写入内容并调整句柄位置后,再读取
f = open(r"C:\Users\Wings\.spyder-py3\read0.txt", "r+", encoding="utf-8")
f.write("李四躲猫猫")
f.seek(0)     #将句柄由内容末尾调整到内容开头
data = f.read()
print(data)   #此时输出内容为"李四躲猫猫星在唱歌"
f.close()

w+模式

w+表示打开一个文件用于读写,如该文件不存在则创建新文件,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被覆盖。

#直接在文件中写入内容
f = open(r"C:\Users\Wings\.spyder-py3\read1.txt", "w+", encoding="utf-8")
f.write("啊咧啊咧")
f.close()
       
#直接读取上述内容
f = open(r"C:\Users\Wings\.spyder-py3\read1.txt", "w+", encoding="utf-8")
data = f.read()
print(data)  #什么都读取不到
#因为w+在进行文件读取时默认先写再读,但由于没有写入,系统默认写入空值覆盖掉了原有内容
f.close()    #此时打开文档查看,里面确实没有任何东西

#写入内容后立即读取
f = open(r"C:\Users\Wings\.spyder-py3\read1.txt", "w+", encoding="utf-8")
f.write("我顶着大太阳,只想为你撑伞")
#如果此时直接进行读取,读取不到内容,因为写入内容后句柄移动到了内容最后
f.seek(0)       #需要调整句柄位置再读取
data = f.read()
print(data)
f.close()

a+模式

a+代表打开一个文件用于读写,如果该文件不存在,创建新文件用于读写;如该文件已存在,文件指针将会放在文件结尾,文件打开时会是追加模式。

#直接在文件中写入内容
f = open(r"C:\Users\Wings\.spyder-py3\read1.txt", "a+", encoding="utf-8")
f.write("咬一口热恋冰淇淋,牵你手漫步夏夜里")
f.close()

#读取文件内容
f = open(r"C:\Users\Wings\.spyder-py3\read1.txt", "a+", encoding="utf-8")
f.seek(0)    #调整句柄位置,再读取文件内容
data = f.read()
print(data)  #我顶着大太阳,只想为你撑伞咬一口热恋冰淇淋,牵你手漫步夏夜里
f.close()

read、readline与readlines

##read的使用
f = open(r"C:\Users\Wings\.spyder-py3\故意杀人.txt", "r", encoding="utf-8")
data = f.read()
print(type(data))   #<class 'str'>
print(data)
f.close()


##readline的使用
f = open(r"C:\Users\Wings\.spyder-py3\故意杀人.txt", "r", encoding="utf-8")
for i in range(3):
    data = f.readline()
    print(data)
f.close()

f = open(r"C:\Users\Wings\.spyder-py3\故意杀人.txt", "r", encoding="utf-8")
for i in range(3):
    data = f.readline().strip()  #去掉每一行末尾的换行符
    print(data)   #此时显示结果行与行之间没有空格
f.close()


##readlines的使用
f = open(r"C:\Users\Wings\.spyder-py3\故意杀人.txt", "r", encoding="utf-8")
data = f.readlines()
print(type(data))  #<class 'list'>
print(data)
f.close()

高效读取大型文件

使用for循环迭代f中的元素,每循环一次就读取一行到内存中,并记住这一次读取到的位置。进行下次迭代时,上一次所读取的内容就会被销毁,当前读取的就是第二行的内容,即每次内存中保留的只有当前循环得到的内容。

f = open(r"C:\Users\Wings\.spyder-py3\故意杀人.txt", "r", encoding="utf-8")
for line in f:
    print(line.strip())
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值