这一部分的总结没有按照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())
|