/ 2018-07-12
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
一、python中操作文件两种方式:
方式一:内置函数open()
file_obj=open(file, mode='r', encoding='utf-8')
参数file用来指定文件的相对路径或绝对路径。
参数mode用来指定文件的打开模式,常用模式如下:
模式 | 描述 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
参数encoding指定操作文件的字符编码,未指定encoding将使用当前操作系统的默认字符编码(Linux默认为UTF-8,Windows默认为GBK)。
方式二:使用with来管理上下文
with会打开文件将文件对象赋值给file_obj,然后在执行完子代码块的文件操作后自动调用file_obj.close()方法。
with open(file, mode='r', encoding='utf-8') as file_obj: 文件操作...
二、操作文件方法:
文件对象file_obj内置了操作文件的方法,常用的读写方法有:
方法名 | 含义 |
file_obj.read() | 默认读取文件所有内容。 |
file_obj.readline() | 默认读取一行内容。 |
file_obj.readlines() | 默认读取文件所有行,以列表的形式返回。 |
file_obj.write(s) | 写入内容s。 |
file_obj.writelines(lines) | 将序列lines中的所有元素写入。 |
当方法read()、readline()返回空字符串/字节串时,代表文件读取完毕,根据这一点,我们可以循环读取文件的每一行内容。
while True: line=file_obj.readline() if not line: break print(line)
也可以使用更为便捷的for循环来迭代读取文件的每一行内容
for line in file_obj: #迭代一次则读出文件一行内容并赋值给line,读完为止 print(line)
三、文件指针移动
每个文件对象内部都维护一个文件指针,以r或w模式打开文件时指针指向文件开头,以a模式打开文件时指针指向文件末尾,读写操作都是基于上一次指针所在位置的基础上进行偏移的。
我们也可以使用方法file_obj.seek(offset,whence)控制指针的偏移:
offset 代表偏移量,单位为字节。
whence 默认值的为0,代表以文件开头为参照物。
whence=1 则代表以当前位置为参照物。
where=2 则代表以文件末尾为参照物。
with open('test.txt','w+b') as f: f.write('大王叫我来巡山'.encode('utf-8')) print(f.tell()) #查看当前指针所在位置为21 f.seek(3,0) #以文件开头为起始,移动3个字节,移过了中文字符'大' print(f.tell()) #查看当前指针所在位置为3 print(f.read(3).decode('utf-8')) #再读取3个字节,解码的结果为字符'好'
(8)