1、打开文件
file = open(‘./child.py’, ‘r’)
打开child.py文件。
第二个参数'r'
表示以文本模式读取。'rb'
表示以二进制格式读取,有些功能只能在二进制格式时使用。
除此之外,还有其他选项:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
比较需要特别注意的是:
- 一般读取文本文件,用
'r'
就可以了; - 写入和读取,都有一个文件指针,这个决定文件从哪里开始读、写(下面细说);
'w'
系列,只适合对 新文件 进行处理。如果你对已有文件进行处理的话,很遗憾,原文件的内容会被清空;- 对已有文件进行追加的处理,应采用
'a'
系列,他会自动从原文件的末尾开始处理。如果该文件不存在,那么会创建一个新文件;
除此之外还有参数:
encoding='gbk'
读取GBK编码的文件;
2、读取文件
str = file.read()
读取全部
str = file.readline()
读取一行(注意:这个会带上最后那个换行符)
解决掉换行符的方法是:file.readline().strip()
,会扔掉字符串 前、后 的空白符(比如空格、或者换行符)。
str = file.readlines()
读取所有行,这个返回的是list。
关于readlines
这个API的解释:
可以加参数,表示单次读取的最大字节数。
每次读完一行都会判断一下,如果已读取的字节数大于这个数字的时候,就停止读取。
例如第一行是ab
外加一个字节换行符(相当于3个字节),
那么参数为 2
的时候,读取完第一行发现已读取3个字节,3 > 2
为True
,因此读取完第一行后会停止下来,直到下次调用的时候才会继续读取。
如果参数为 3
,那么读取完第一行发现 3 > 3
为False
,因此会继续读取第二行。
3、关闭文件
flie.close()
记得一定要关闭文件。
4、简化写法
with open('./child.py', 'r') as f:
print(f.read())
这个会自动帮你调用f.close()
,但唯一问题是,他不会帮你处理异常。
所以可以用以下方法解决:
try:
with open('./abc.py', 'r') as f:
print(f.readline().strip())
except Exception as e:
print('文件打开失败,原因是:', e)
输出:
文件打开失败,原因是: [Errno 2] No such file or directory: './abc.py'
5、写文件
在文件指针处开始写入。
因为'w'
会覆盖原文件,因此默认是在文件开头,而'a'
会在原文件末尾进行追加,因此默认是从原文件末尾开始。
file.write(str)
注意,参数必须是字符串,数字是不行的,如果是数字,可以用str()
强制转换为字符串使用。
6、获取当前文件指针所在位置
f.tell()
返回值是数字(int)。
几个比较重要的概念:
- 文件的开头是0。(
'r'
模式打开,还没有调用read方法); - 读取和写入,都是从当前文件指针所在位置开始;
- 可以理解为list,第一个元素(字节)的位置为0,第二个为1,如果想从第二个字节开始读/写,那么应先把文件指针移动到
f.tell()
的返回值为1
的地方; 'a+'
模式固定在文件末尾追加,因此无论tell()
返回多少,或者移动文件指针,都不影响他从文件末尾开始写。
7、移动文件指针的位置
f.seek(移动字节数, 可选相对位置)
第一个指移动相对于参考位置的位置;(结合第二个参数理解)
第二个是可选的,默认为0(即文件开头)。只有当读取模式里有'b'
的时候,才可以为 1
或 2
。1表示从当前文件指针位置,2表示从文件末尾。
假如参数为(1,0)
或(1)
,那么表示将文件指针移动到第二个字节的位置;
如代码:
with open('./test.txt', 'r') as f:
print(f.tell())
f.seek(1)
print(f.tell())
f.seek(1)
print(f.tell())
# 0
# 1
# 1
假如open的时候,模式带b
,即表示以字节的形式读取,那么参数二可以为非0参数。
例如,参数为(1, 1)
,那么会相对于当前文件指针位置移动。如代码:
with open('./test.txt', 'rb') as f: # 第二个参数多'b'
print(f.tell())
f.seek(1)
print(f.tell())
f.seek(1, 1) # 这行不同
print(f.tell())
# 0
# 1
# 2
当第二个参数为2的时候,表示从文件末尾开始计算(即最后一个字符的下一个位置,例如假如只有3个字符,那么最后一个字符的下一个位置就是3)
## test.txt
123
## test.py
with open('./test.txt', 'rb+') as f:
f.seek(0, 2)
print(f.tell())
f.write(b'4')
# 3
## test.txt
1234