一 文件的打开与关闭
1. 文件的打开与关闭
python中用open()函数来打开一个文件,close()方法来关闭一个文件。 这里先记录用open()函数和close()方法来操作文件,with…as 放后面再记录。如果用open()来操作一个文件,那么一定要用文件的close()方法来关闭文件,这样才能保证数据全部被写入到文件中,否则可能存在数据丢失。 语法格式如下
open(filename, mode, enconding)
filename: 文件名字.后缀
mode: 打开文件的方式
enconding: 编码方式
filename.close()
例子:以w(只写入模式,如果没有改文件,则新创建一个文件)模式打开test.txt文件,并写入内容:键盘敲烂,工资过万
file = open("test.txt", 'w')
file.write("键盘敲烂,工资过万")
file.close()
我们在当前py文件目录下可以看到,已经新建了一个test.txt文件,并写入了内容,如下 其中要注意的是文件的路径,可以在当前路径,可以在其它路径。
2. 文件的属性
python中文件也是对象,它也有自己的属性,常用的如下
- file.name:返回文件的名字
- file.closed:查看文件是否关闭,如果已关闭就返回True,否则返回False
- file.mode:返回文件被访问的模式
- file.enconding:返回文件的编码方式
如下:
file = open("test.txt", 'w')
file.write("键盘敲烂,工资过万")
print("文件是否关闭:", file.closed)
file.close()
print("文件是否关闭:", file.closed)
print("文件的名字:", file.name)
print("文件的访问模式:", file.mode)
print("文件的编码是:", file.encoding
二 文件的访问模式(mode参数
) python中访问文件时默认为文本模式,如果要以二进制模式打开,加上 b,各种模式如下
r | 以只读方式打开文件。指针将会放在文件的开头(这是默认模式) |
---|
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 | r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 | rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 | w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 | wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 | w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 | wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 | a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 | ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 | a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 | ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
三 文件的读写
在了解了怎么打开关闭文件,以及以什么方式访问文件后,下面来看一下文件的读写操作
1. 文件的写操作write()方法
python通过文件对象的 write() 方法来将字符串写到文件中,不过在写的时候不会自动换行,如果做换行操作,要自行加换行符\n,如下
file = open("test.txt", 'w')
msg = "键盘敲烂\n工资过万\n有一种投资会永远不会亏本\n那就是投资自己"
file.write(msg)
file.close()
2. 文件的读操作
python中读取文件的方法有三种,分别是read(),readline()和readlines(),三者的用法如下
- read([size]):默认读取全部文件内容,如果有size参数,则读取前size个字节数。
file = open("test.txt", 'r')
msg = file.read()
print(msg)
file.close()
- readline():按行读取文件的内容,换行符号 ‘\n’。
file = open("test.txt", 'r')
msg1 = file.readline()
print("这是第一行:", msg1.rstrip())
msg2 = file.readline()
print("这是第二行:", msg2.rstrip())
file.close()
- readlines():以列表的形式返回读取内容,列表的每一个元素对应文件的一行。
file = open("test.txt", 'r')
msg = file.readlines()
print(msg)
file.close()
四 with…open…as操作文件
前面已经说过,我们在用open()函数操作文件时,一定要调用close()方法来关闭文件,即一定要保证文件要关闭。这是因为文件操作是一个I/O操作,当我们写文件时,操作系统往往不会立即把数据写入到磁盘,而是先放到内存缓存起来,等空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘同时释放资源。如果不这样做的话,可能造成数据丢失和资源浪费。 上面写的一些代码示范其实是不严谨的,如果我在打开文件后,对文件进行操作时发生了异常,又没有做异常处理,那么程序就会抛错,close()方法就不会被执行,从而就会出现上面的风险。 可以使用异常处理try…except…finally来编写,将close()方法放在finally后面,这样即便前面的代码出错了,文件也照样能关闭如下
try:
file = open("test.txt", 'w')
msg = "键盘敲烂\n工资过万\n抛弃一切幻想\n努力前行!"
file.write(msg)
except:
pass
finally:
file.close()
上面的处理方式虽然可以,但是不符合pytho的风格,不够简洁。于是with…open…来了,它的作用和try…except…finally一样,能够确保文件一定被关闭,不用手动再调用close方法,书写方式如下
with open("test.txt", 'w') as f:
msg = "键盘敲烂\n工资过万\n抛弃一切幻想\n努力前行!"
f.write(msg)
print("文件是否关闭:", f.closed)
五 定位操作 tell() 和 seek()
在操作文件时,当我们想知道,当前指针位置和改变指针位置时,可以使用文件对象的tell()方法和seek()方法,如下
- tell():返回指针的位置
- seek(offset[,whence]):改变当前指针的位置,offset参数表示要移动的字节数,from参数可有可无,表示要移动的参考位置。如果whence=0,则使用文件开头的位置作为参考位置;如果whence=1,则使用当前的位置作为参考位置;如果whence=2,则使用文件末尾的位置作为参考位置。
with open("test.txt", 'w', encoding="utf-8") as f:
msg = "键盘敲烂\n工资过万\n抛弃一切幻想\n努力前行!"
f.write(msg)
with open("test.txt", 'r', encoding="utf-8") as f:
msg1 = f.readline()
print(msg1.rstrip())
print("当前指针位置: ", f.tell())
print("从文件开头移动14个字节后读取文件内容:")
ps = f.seek(f.tell(), 0)
msg2 = f.read()
print(msg2.rstrip())
这里需要注意的是当操作文件模式不带b(即不是rb,wb,ab)时,seek()的whence参数只能为0,即只能从文件开头进行偏移。 不然会报下面的错
如果seek()参数whence要设置为1或者2,那么操作模式必须带有b,即rb,wb或者ab
|