文件存在的意义:使得数据持久化。当程序在运行的时候,所有的数据都是在内存上的,程序一结束内存的数据就会消失。文件是存储在硬盘上的,硬盘上的数据是可以长时间保存的,因此想要保存数据就要进行文件操作。归根究底,文件只有两个操作:读、写。
在window下,文件分为很多不同的格式而且默认以后缀来区分,之所以要分成各种不同的文件是为了方便对种类不同文件进行操作。
基本操作步骤
第一种
- 打开文件,打开的同时指定打开方式。
- 操作文件;
- 关闭文件
f = open("test.txt","w") f.write("hello Python!") f.close()
以上代码执行后会在当前程序所在的目录下生成一个test.txt文件,文件的内容是:hello Python!。
代码中open()函数的第一个参数是文件名,第二个参数是打开的模式,r代表读,w代表写。以r方式打开的文件不能进行w操作,以w方式打开的文件不能进行r操作。open()函数返回一个文件对象,通过这个文件对象来进行文件的操作。操作完文件后使用close()方法关闭文件。
第二种
使用with.......as关键字,这种方式不用担心没有关闭文件的问题。
with open("test2.txt","w") as f2: f2.write("123456")
如果文件是以w方式打开并且文件已经存在,文件的原由内容会被覆盖。
路径问题
在操作系统中为了标识某一个文件所在的位置,提出了文件路径可以表示为绝对路径和相对路径两种形式。
绝对路径:
在window系统中,如果一个路径是以盘符开始表示的那就是一个绝对路径,如:C:\Users\me\Desktop。需要注意的是“\”是反斜杠,在实际的代码编程中有特殊的意义,因此在代码中出现绝对路径需要使用转义字符。
相对路径:
相对路径多在代码中使用,试想如果你自己在代码中以绝对路径打开一个文件,而这个绝对路径在另一个人的电脑上却没有,那么程序便不能正常运行。因此在实际的开发过程中使用相对路径。
相对路径是相对于程序当时所在的路径为基准,表示当前路径的话可以使用. ,当前路径的上一级可以使用 ../ 。
上面程序中已经创建了test.txt文件,现在来以相对路径的方式读出文件内容。
f = open("./test.txt","r") read_result = f.read() print(read_result) f.close()
文件操作模式
open()函数的第二个参数,模式还有其他写法,一起看一下。
模式 | 说明 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
文件read
read():读取文件全部内容到内存。当文件比较大的时候,可能会导致程序出现问题。
with open("test.txt","r") as f: content = f.read() print(content)
read(字符数):读取指定数量的字符数到内存。
with open("test.txt","r") as f: content = f.read(10) print(content)
readlines():同样是读取全部内容到内存,但是返回的是一个列表,列表中的每一个元素就是一行数据。
with open("test.txt","r") as f: content = f.readlines() print(content)
当读取大文件的时候要结合while()循环并使用read(字符数)或者readline(),当文件读到末尾的时候退出循环。
with open("test.txt","r") as f: while True: content = f.readline() if len( content) == 0: break print("%s" % content,end="")
文件定位
在操作文件(读、写)的时候会有文件指针存在,当打开的文件的时候文件指针是指向文件开头的,每次读取之后文件指针就会往后移动相应的字符数。看下面的例子:
with open("test.txt","w+") as f: f.write("hello world!") content = f.read() print(content)
运行后会发现并没有输出任何值,因为当你read的时候文件指针已经位于文件的末尾了,从末尾开始读肯定读不到任何数据。
tell():获得文件当前的偏移
seek(offset,whence):在whence的基础上偏移offset个字符,whence有三种取值:0,1,2。0表示文件开头,1表示文件的当前指针的位置,2表示文件末尾。在Python3中只能相对与文件的开头进行偏移。
在上面的例子中,文件指针已经到了文件末尾,如果想读出文件的内容需要将文件指针移动到文件开头。
with open("test.txt","w+") as f: f.write("hello world!") current = f.tell() print("current:",current) f.seek(0,0) content = f.read() print(content)