Python __ 文件的基本操作
打开文件
使用位于自动导入的模块io中的open函数
file object = open(file_name [, access_mode][, buffering] [, encoding])
参数:
-
file_name:要访问的文件名称的字符串值。
如果在当前目录可以使用相对路径
如果在其他地方,必须使用完整路径 -
access_mode:打开文件的模式。
是非强制的,默认文件访问模式为只读(r)。 -
buffering:是否设置缓冲区
如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。
如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。
如果取负值,寄存区的缓冲大小则为系统默认。 -
encoding: 如果是以文本模式打开, 可以使用该参数设定文件的编码方式。
还有个参数errors可以设定Unicode错误处理策略
注意:
-
open()不是只能打开一个已经存在的文件。
如果是以如写入文件等方式打开,如果文件不存在会自动创建 -
open() 打开文件之后,文件的内容并没有在内存中
-
文件读写之后,要调用close()才能确保文件被保存在磁盘中
文件模式 mode
值 | 作用 | 注意 |
---|---|---|
r | 读取文件 | 默认值,若文件不存在则会报错 |
w | 写入文件 | 若文件不存在则会先创建再写入,会覆盖原文件 |
x | 独占写入模式 | 若文件已存在引发异常 |
a | 附加模式 | 若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾 |
+ | 读写模式 | 与其他模式结合使用 |
b | 二进制模式 | 与其他模式结合使用 |
t | 文本模式 | 默认值;与其他模式结合使用 |
注意:
-
这里的覆盖是指打开文件时,将既有内容删除(截断),并从文件开头处开始写入。
-
r+和w+不同
:
w+会截断文件
r+不会截断 -
如果为“t”模式,意味着将文件视为经过编码的Unicode文件,因此会自动执行解码和编码。Windows(中文)下默认为gbk,其他环境为utf8
-
- 还会自动转化换行字符“\n”为“os.linesep()”
-
- 如果 不想自动转化换行符,可以使用参数newline,设为:
newline=''
即可。
- 如果 不想自动转化换行符,可以使用参数newline,设为:
- 如果时读取非文本文件记得使用二进制模式(如'rb')
读取和写入
注意: 文本模式下数据类型为str,二进制模式下数据类型为bytes类
f.write()和f.read()
f.write(str): 将提供的字符串写入到文件既有内容的后面
f.read([size]): 从文件当前位置开始,读取指定 size 大小的数据。如果 size 为负数或者空,则读取到文件结束。
f.readline()
f.readline([size]):如果不提供参数size,则返回一行。如果提供,则是指定最多可以读取多少个字符。
f.readlines()和f.writelines()
f.readlines([size]) : 将文件读取到一个字符串列表中,其中每个字符串都是一行, 此时size表示行数
f.writelines(sequence): 可以传入字符串或者字符序列(或者任何可迭代对象)
注意:
无论是使用out.write还是使用out.writelines,都只是单纯的内容写入到文本文件中,并不会自动添加换行符,如果需要换行符必须额外写入。
关闭文件
为什么要关闭:
对于读取的文件,文件关闭没有特别重要。
但是在某些系统可以
- 避免无意义的锁定文件。
- 避免用完系统可能指定的文件打开配额。
对于写入过的文件要及时关闭,因为:python可能缓冲写入的数据:
即:用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还有一部分有可能会留在内存这个缓冲区中。
如果关闭:使用f.close()关闭即可。
如果要重置缓冲,让所做的修改反映到磁盘文件中,又不想关闭文件,可以使用flush()方法用来在不关闭文件对象的情况下将缓冲区内容写入文件。
上下文管理器:with
使用上下文管理关键字with可以自动管理文件对象:
不论何种原因结束该关键字中的语句块,都能保证文件被正确关闭。
with语句能够打开文件并将其赋给一个变量(这里是somefile)。
with open("somefile.txt") as somefile:
do_something(somefile)
迭代文件内容
每次一个字符(或字节)
with open(filename) as f:
while True:
char = f.read(1)
if not char: break
process(char)
这个程序之所以可行,是因为到达文件末尾时,方法read将返回一个空字符串,但在此之前,
返回的字符串都只包含一个字符(对应于布尔值True)。只要char为True,你就知道还没结束。
每次一行
通过使用readline,就可像迭代字符一样迭代行。
with open(filename) as f:
while True:
line = f.readline()
if not line: break
# not与逻辑判断句if连用,代表not后面的表达式为False的时候,执行冒号后面的语句。
process(line)
文件迭代器(最常见)
文件实际上是可迭代的,这意味着可在for循环中直接使用它们来迭代行。
with open(filename) as f:
for line in f:
process(line)
请注意,与其他文件一样,sys.stdin也是可迭代的,因此要迭代标准输入中的所有行,可
像下面这样做:
import sys
for line in sys.stdin:
process(line)
常用函数
Python标准库os中用来列出指定文件夹中的文件和子文件夹列表的方式是(listdir )。
Python标准库os.path中用来判断指定文件或目录是否存在的方法是( os.path.exists() )。
f.seek(偏移量,[起始位置]):用来移动文件指针。
偏移量: 单位为字节,可正可负
起始位置:
0 - 文件头, 默认值;
1 - 当前位置;
2 - 文件尾
扩展库os中的方法remove()不可以删除带有只读属性的文件。
文件对象的tell()方法用来返回文件指针的当前位置
Python标准库os.path中isdir(path) 方法用来判断指定路径是否为系统已存在的文件夹(目录)
Python标准库os.path中isfile(path) 方法用来判断指定文件是否为系统已存在的文件。
os.remove( filename )
filename: 要删除的文件名
产生异常的可能原因可能是:文件filename 不存在,或者对filename文件没有操作权限或只读。