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错误处理策略

注意:

  1. open()不是只能打开一个已经存在的文件。
    如果是以如写入文件等方式打开,如果文件不存在会自动创建

  2. open() 打开文件之后,文件的内容并没有在内存中

  3. 文件读写之后,要调用close()才能确保文件被保存在磁盘中

文件模式 mode

作用 注意
r 读取文件 默认值,若文件不存在则会报错
w 写入文件 若文件不存在则会先创建再写入,会覆盖原文件
x 独占写入模式 若文件已存在引发异常
a 附加模式 若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾
+ 读写模式 与其他模式结合使用
b 二进制模式 与其他模式结合使用
t 文本模式 默认值;与其他模式结合使用

注意:

  1. 这里的覆盖是指打开文件时,将既有内容删除(截断),并从文件开头处开始写入。

  2. r+和w+不同
    w+会截断文件
    r+不会截断

  3. 如果为“t”模式,意味着将文件视为经过编码的Unicode文件,因此会自动执行解码和编码。Windows(中文)下默认为gbk,其他环境为utf8

    • 还会自动转化换行字符“\n”为“os.linesep()”
    • 如果 不想自动转化换行符,可以使用参数newline,设为:newline=''即可。
  1. 如果时读取非文本文件记得使用二进制模式(如'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,都只是单纯的内容写入到文本文件中,并不会自动添加换行符,如果需要换行符必须额外写入。

关闭文件

为什么要关闭:
对于读取的文件,文件关闭没有特别重要。
但是在某些系统可以

  1. 避免无意义的锁定文件。
  2. 避免用完系统可能指定的文件打开配额。

对于写入过的文件要及时关闭,因为: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文件没有操作权限或只读。

posted @ 2022-06-04 17:37  kingwzun  阅读(401)  评论(0编辑  收藏  举报