Python进阶10 文件

一、打开关闭文件

1、打开文件

函数open用于打开文件,文件名是必不可少的参数,并返回一个文件对象。

file object = open(file_name, access_mode, buffering])

file_name: 文件名(或路径),强制参数,其他参数是可选的。
access_mode: 打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering: 表示是否需要缓冲,为可选参数,默认值为-1,表示使用系统默认的缓冲区大小。(0代表不缓冲,>=1的值表示缓冲一行或指定缓冲区大小)。

不同模式打开文件的完全列表:

模式描述
t 文本模式 (默认,与其他模式结合使用)
x 独占写入模式
b 二进制模式(与其他模式结合使用)
+ 读写模式(与其他模式结合使用)
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。

以下是和file对象相关的所有属性的列表:

属性描述
file.closed 返回true如果文件已被关闭,否则返回false。
file.mode 返回被打开文件的访问模式。
file.name 返回文件的名称。

2、关闭文件

File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。

当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。

语法:

fileObject.close()
# 打开一个文件
f = open("test.txt", "w")
print("文件名: ", f.name)
 
# 关闭打开的文件
f.close()

二、读文件

1、read()方法

read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

fileObject.read([size])

如果没有传入size,它会一次性读取文件的全部内容,保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。

while True:
    char = f.read(4)
    print(char)
    if not char:
        break

2、按行读取

readline()方法每次读取一行(从当前位置到下一个换行符的文本)。

readlines()方法一次读取所有内容并按行返回list。

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

for line in f.readlines():
    print(line.strip()) # 把末尾的'
'删掉

3、文件迭代器

文件实际上是可迭代的,这意味着可在for循环中直接迭代行。

# 打开一个文件
f = open("test.txt")

for line in f:
    print(line)

# 关闭打开的文件
f.close()

三、写文件

1、write()方法

可以直接调用f.write(string)方法写入文件内容。

2、多行写入

方法writelines与readlines相反:接受一个字符串列表(实际上,可以是任何序列或可迭代对象),并将这些字符串都写入到文件中。

四、使用上下文管理器

Python提供了 with 语句来管理资源关闭。比如可以把打开的文件放在 with 语句中,这样 with 语句就会帮我们自动关闭文件。

with open('somefile.txt') as somefile:
    do_something(somefile)

with语句让你能够打开文件并将其赋给一个变量(这里是somefile)。在语句体中,你可以读写文件。到达该语句末尾时,将自动关闭文件,即使出现异常亦如此。

with语句实际上是一个非常通用的结构,允许你使用上下文管理器。

关于上下文管理器,可以参考下面这边文章,感觉写的简洁又清晰:

https://www.cnblogs.com/wongbingming/p/10519553.html

原文地址:https://www.cnblogs.com/mazhiyong/p/12574802.html