在磁盘上读取文件的 功能都是由操作系统来实现的,不允许普通的程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
操作系统都有自己的编码,文件打开时如果你不指定编码方式就会默认使用操作系统的编码。win操作系统:GBK.。Mac/linux操作系统:utf-8.
f=open("nihao","w",encoding="utf-8")
f.write("你好我的做过")
f.close
打开文件方:1.两个文件在同一路径内,直接写名字。
2.两个文件不在同一路径内。用写入文件的绝对路径,绝对路径不区分大小写,我试过。文件的路径需要用取消转译的方法表示。
转义字符是一种特殊的字符常量。转义字符以反斜线"\"开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。
在Unix和Web用正斜杠/ 来表示路径的分割,
在Windows中,路径分隔采用反斜 杠"\",比如"C:\Windows\System"。
但是在打开文件的方式中需要注意:因为open里的路径用引号包裹上,就形成了字符串,由于反斜杠在字符串中是转义字符的意思,会把后边的内容转义,所以我们要避免转义,让它表达它原来分割路径的意思,有三种方法可以取消转义:
这里有三种方式:
方式一:前边加r(不区分大小写)路径也不区分大小写。
f=open(r"C:\Users\张守业\Desktop\111.txt","w",encoding="utf-8")
f.write("你好我的做过")
方式二:单斜杠\变为双斜杠\\
f=open("c:\\users\\张守业\\Desktop\\aBC.txt","w",encoding="utf-8")
f.write("你")
方法三:用正斜杠/来代替反斜杠/
with open("C:/Users/张守业/Desktop/你.txt",encoding="Gbk") as f:
print( f.read())
文件写入:
w: 写模式。不存在的文件会创建一个文件,再写入。如果有会清除原文件再写入。encoding的意思就是你写入的字符串需要转换成什么编码方式保存起来
w+:写读模式。不存在的文件会创建一个文件,再写入。如果有会清除原文件再写入。写完后可以读取。注意f.read()时,前边一定要有一个f.seek(0),这样才能从头开始读取,否则读不出东西。因为对于read模式,指针在哪里,就从哪里开始读,write后,指针在文档最后,所以读不出东西。
wb: 二进制写读模式:写入二进制文件。
f=open("歌词","w+",encoding="utf-8")
f.write("我是中国人")
f.seek(0) #一定要有这个
print(f.read())
f.close()
a:追写模式:和w相同,他不会清除原文件,会在文档末尾继续接着写。
a+:追写读模式。和w+相同,他不会清除原文件,会在文档末尾继续接着写。
ab二进制追加模式。
非文本文件读取:rb
对于非文本文件(例如图片视频),我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb
wb
ab
#注:以b方式打开时,因为要读取的二进制的文件,读取的内容即是字节类型(bytes),所以就不需要指定encode了.
文件读取的第一种方法:f.read(). 一次性读取完。以r模式打开按字符读,以rb的模式打开按字节读
文件读取的第二种方法:f.readline().strip()逐行读取#strip删除空格,换行符,制表符。
文件读取的第三种方法:f.readlines()返回一个列表,将文件的每一行作为列表的每一项返回一个列表。
文件读取的第四种方法: for i in f 节省内存每一次只存一次,这个方法最常用。注意这个是逐行的读取,而不是一个个的字读。这个和单个字符串不一样,因为这是打开文件特别规定的。
例子:(文件也是一个迭代器)
with open("产品",encoding="utf-8") as f:
for i in f: ###这里不是f=f.read(),然后再for i in f. 这样做是错误的。
i=i.strip()
print(i)
r:读模式。
r+ 读写模式。
rb 二进制读模式
seek() 方法用于移动文件读取指针到指定位置,光标移动到第几个字节。 f.seek(0)移动到开始,f.seek(0,2)移动到文件末尾。
tell():告诉光标在第几个字节。
truncate():从文件开始的位置,只保留指定字节的内容
换行符是\r\n 2个字符位,如果是\n 就是一个字符位,但window会自动在\n前加\r 空格就是1个字符位,
文件的关闭:
需要注意的是:文件读写操作完成后,应该及时关闭。一方面,文件对象会占用操作系统的资源;另外一方面,操作系统对同一时间能打开的文件描述符的数量是有限制的,如果不及时关闭文件,还可能会造成数据丢失。因为将数据写入文件时,操作系统不会立刻把数据写入磁盘,而是先把数据放到内存缓冲区异步写入磁盘。当调用close方法时,操作系统会保证把没有写入磁盘的数据全部写到磁盘上,否则可能会丢失数据。
文件的关闭有两种方法:
方法一:文件最后加入f.close( )
方法二:用第一种方法关闭文件时比较麻烦,经常忘记写f.close(),为了避免这个问题,出现了一个新方法
with open("产品","r",encoding="utf-8") as f :
print (f.read()) #这里就不需要加f.close( )
文件的修改:
python本身没有文件直接修改原文件功能,但是可以间接的的实现。
主题思路:1.把原文件的内容存到一个变量中。
2.把老词语替换成新词语
3.创建一个新文件,把原文件的内容写到新文件中。
4.把新文件的名字改成原文件的名字。
方法一:
with open("歌词","r",encoding="utf-8") as f:
old_content=f.read()
new_content=old_content.replace("我们","we")
print(new_content)
f.close()
with open("歌词2","w",encoding="utf-8") as f2:
f2.write(new_content)
f.close()
import os
os.remove("歌词")
os.rename("歌词2","歌词")
方法二: 运用for 循环的方法
with open("歌词","r",encoding="utf-8") as f,open("歌词2","w",encoding="utf-8") as f2: 注意文件变量不能是一样的
for line in f:
if line.strip(): #注意不要把每句话的换行符给去掉
new_line=line.replace("我们","we")
f2.write(new_line)
import os
os.remove("歌词")
os.rename("歌词2","歌词")
题目:
把(0,99)中偶数写入文档里,并竖行读取它。
f=open("歌词","w+",encoding="utf-8")
for i in range(0,100,2):
i=str(i)
f.write("{}\n".format(i))
f.seek(0)
print(f.read())