打开与关闭¶
open和close¶
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
打开 file 并返回对应的文件对象file object。 如果该文件不能被打开,则引发 OSError(如文件已被其它程序打开或上一次程序未结束同时未关闭文件等)
-
file:必选,将要打开的文件的路径(绝对路径或者相对当前工作目录的路径)
-
系统路径:指从系统资源管理器直接复制来的文件路径,以反斜杠("\")分级。如"D:\OneDrive\文档\8.Py_Project\TEMP\Temp\FPKM.txt"
-
输入路径:指python代码编写时应传入的文件路径,以正斜杠("/", "\")分级。如"D:/OneDrive/文档/8.Py_Project/TEMP/Temp/FPKM.txt" 或 "D:\OneDrive\文档\8.Py_Project\TEMP\Temp\FPKM.txt"(因为"\"在python中被解释为转义符)
-
绝对路径:指从磁盘根目录一直到文件名的完整路径,如上
-
相对路径:指相对于所执行python文件所在目录的路径,以"./"表示当前目录,如"./FPKM.txt",同目录时可直接省略用文件名,如直接用"FPKM.txt"
- mode:指明文件打开模式的可选字符串,可选。常见"r"(默认,文本模式读取,等价于"rt")、"rb"(二进制模式读取)、"r+"(读取并同时写入)、"w"(文本模式覆盖写入,等价于"wt")、"wb"(二进制模式写入)、"a+"(文本模式追加写入同时读取)等,见后
| 模式 | 含义 |
|---|---|
| "r" | 读取(默认),文件不存在则报错 |
| "w" | 覆盖写入,文件不存在则创建 |
| "a" | 追加写入,文件不存在则创建 |
| "x" | 创建写入,文件存在则报错 |
| "t" | 文本模式(默认),用于文本文件的读写 |
| "b" | 二进制模式,用于流文件如mp4、mp3、xlsx、docx、pdf、exe等文件的二进制读写 |
| "+" | 同时读写 |
-
buffering:略
-
encoding:只在文本模式下使用,可选。将文件的二进制源码按指定编码格式进行编码解码,文件是以什么编码格式储存的就设置为什么编码格式,以防出现乱码和报错,常用"utf-8"。默认使用的编码格式依赖于具体平台,可能是"GBK"。
-
errors:只在文本模式下使用,可选,一般不传入参数。用于指定如何处理编码和解码错误
-
"strict":默认。存在编码错误时会引发
ValueError异常 -
"ignore":忽略编码错误,可能会导致数据丢失
-
"replace":将替换标记(例如 '?' )插入有错误数据的地方
-
"surrogateescape":把任何不正确的字节表示为 U+DC80 至 U+DCFF 范围内的下方替代码位。 当在写入数据时使用 surrogateescape 错误处理器时这些替代码位会被转回到相同的字节。 这适用于处理具有未知编码格式的文件。
-
"xmlcharrefreplace":仅在写入文件时才受到支持。 编码格式不支持的字符将被替换为相应的 XML 字符引用 &#nnn;
-
"backslashreplace":用Python的反向转义序列替换格式错误的数据
-
"namereplace":只在编写时支持,用 \N{...} 转义序列替换不支持的字符
-
newline:只在文本模式下使用,可选,一般不传入参数。决定如何解析文件的换行符。 它可以为
None,'','\n','\r'和'\r\n'。见file.tell() -
closefd:略
-
opener:略
file = open("FPKM.txt", "r", encoding="utf-8") # 打开文件,并将文件对象赋值给变量file
print(file) # 打印file:<_io.TextIOWrapper name='FPKM.txt' mode='r' encoding='cp936'>
print(file.closed) # 判断文件是否关闭:False
file.close() # 关闭文件
print(file.closed) # 判断文件是否关闭:True
with open() as¶
参数同上,注意缩进,缩进结束文件自动关闭,可以同时用open()打开多个文件(见后)
with open("FPKM.txt", "r", encoding="utf-8") as file: # 打开文件,并将文件对象赋值给变量file
print(file) # 打印file:<_io.TextIOWrapper name='FPKM.txt' mode='r' encoding='cp936'>
print(file.closed) # 判断文件是否关闭:False(缩进未结束,文件操作未结束,文件未关闭)
print(file.closed) # 判断文件是否关闭:True(缩进结束,文件操作结束,文件自动关闭)
读取¶
read¶
file.read(size)
从文本指针处(一般打开文件时指针位置在文本开头)开始读取整个文本,读取的内容形成一个字符串(文本模式),或字节串对象(二进制模式)
-
size:指定读取内容的长度
-
省略或负数:默认为-1,读取并返回整个文本内容
-
文本模式:读取并返回最多前size个字符
-
二进制模式:读取并返回最多前size个字节
with open("FPKM.txt", "r", encoding="utf-8") as file:
text = file.read(53) # 读取从文件开头开始的53个字符,包括换行符"\n"
print(text)
"""
ID Fruit Root Stem Leaf
"""
with open("FPKM.txt", "r", encoding="utf-8") as file:
text = file.read(100)
print(text)
"""
ID Fruit Root Stem Leaf
gene1 324.1 10131.62 2345.36
"""
readline¶
file.readline(limit)
从文本指针处开始读取一行,到换行符结束(包括换行符),形成一个字符串
-
limit:指定读取内容的长度
-
省略或负数:默认为-1,读取并返回整行内容
-
文本模式:读取并返回最多该行前size个字符
-
二进制模式:读取并返回最多该行前size个字节
with open("FPKM.txt", "r", encoding="utf-8") as file:
line1 = file.readline()
line2 = file.readline()
line3 = file.readline()
print(line1, line2, line3)
"""
ID Fruit Root Stem Leaf
gene1 324.1 10131.62 2345.36 7730.21
gene2 46 4460.22 17132.75 43406.46
"""
with open("FPKM.txt", "r", encoding="utf-8") as file:
line = file.readline(100)
print(line)
"""
ID Fruit Root Stem Leaf
"""
readlines¶
file.readlines(hint)
从文本指针处开始读取所有行,每行到换行符结束,将每一行作为字符串元素存入列表
- hint:省略时默认读取所有行,此时等价于
list(file);指定以控制读取的行数。以字符(文本模式)或字节(二进制模式)为单位,hint指定的大小读到了哪一行,就输出多少行;读到换行符"\n"时会多读取下一行。(每行输出的长度与hint无关,都是整行输出)
# 注意:所用文本第一行包括"\n"在内一共53个字符
with open("FPKM.txt", "r", encoding="utf-8") as file:
lines = file.readlines(52) # 读到第一行但未读到第一行换行符,只输出第一行
print(lines)
"""
['ID Fruit Root Stem Leaf\n']
"""
with open("FPKM.txt", "r", encoding="utf-8") as file:
lines = file.readlines(53) # 读到第一行且读到第一行换行符,输出第一行及下一行
print(lines)
"""
['ID Fruit Root Stem Leaf\n', 'gene1 324.1 10131.62 2345.36 7730.21\n']
"""
with open("FPKM.txt", "r", encoding="utf-8") as file:
lines = file.readlines(54) # 读到第二行但未读到第二行换行符,只输出第一行和第二行
print(lines)
"""
['ID Fruit Root Stem Leaf\n', 'gene1 324.1 10131.62 2345.36 7730.21\n']
"""
遍历¶
with open("FPKM.txt", "r", encoding="utf-8") as file:
n = 0 # 仅用于控制输出行数,无其它特殊用意
for line in file:
print(line, end="")
n += 1
if n == 2:
break
"""
ID Fruit Root Stem Leaf
gene1 324.1 10131.62 2345.36 7730.21
"""
写入¶
write¶
file.write(string)
把string内容(字符串或字节对象)写入到文件中,并返回写入的字符或字节数
with open("FPKM_out.txt", "w", encoding="utf-8") as file:
byte = file.write("ID Fruit Root Stem Leaf\ngene1 324.1 10131.62 2345.36 7730.21")
print(byte) # 108
writelines¶
file.writelines(lines)
**lines**参数可以是字符串或字节对象,也可以是列表。当为字符串或字节对象时,用法同write();当为列表时,将列表的字符串或字节对象元素拼接后组成的内容写入文本(若每个元素以换行符"\n"结尾,正好相当于每个元素为一行内容)
with open("FPKM_out.txt", "w", encoding="utf-8") as file:
file.writelines("ID Fruit Root Stem Leaf\ngene1 324.1 10131.62 2345.36 7730.21")
with open("FPKM_out.txt", "w", encoding="utf-8") as file:
file.writelines(["ID Fruit Root Stem Leaf\n", "gene1 324.1 10131.62 2345.36 7730.21"])
with open("FPKM_out.txt", "w", encoding="utf-8") as file:
file.writelines(["ID Fruit Root Stem Leaf", "gene1 324.1 10131.62 2345.36 7730.21"])
前两个操作结果结果同上,第三个操作结果如下:
文本指针¶
每次打开文件时,文本的指针都在文件的开头(位置为0),在文件的读写操作过程中,指针发生移动,也可以指定指针的位置。
tell¶
file.tell()
返回当前文件指针的位置,以字节为单位。
注意文本文件打开后右下方状态栏显示,根据编码模式与newline参数(一般不传,使用默认)决定换行符的显示与字节占用情况。若为"UTF-8"的"CRLF"模式(文本文件创建时的默认模式),换行符"\n"被解释为"\n\r"(输出还是"\n"),占两个字节,汉字占3个字节;若为"LF模式",换行符仍解释为"\n",占一个字节,汉字占两个字节。 上述文本文件为默认模式。
with open("FPKM.txt", "r", encoding="utf-8") as file:
loc = file.tell()
print(loc) # 0
line1 = file.readline() # 读取一行后,指针位置也随之变化,移到换行符号(此模式下占2个字节)后
loc = file.tell()
print(loc) # 54
seek¶
file.seek(offset, whence)
通过向参考点whence添加 offset 偏移量,计算并改变指针位置
-
offset:相对参考点的偏移量,单位为字节。
-
whence:参考点。文本模式下唯一有效值为0或
file.tell()返回值 -
0:默认,表示从文件开头计算
-
1:表示使用当前指针位置。文本模式不可用。
-
2:表示使用文件末尾。文本模式不可用,除了
seek(0, 2)定位在文本末尾。
with open("FPKM.txt", "r", encoding="utf-8") as file:
file.seek(1)
line = file.readline()
print(line)
"""
D Fruit Root Stem Leaf
"""
with open("FPKM.txt", "r", encoding="utf-8") as file:
file.seek(0, 2)
loc = file.tell()
print(loc) # 5307
二进制模式¶
可用于网络爬虫时媒体文件的下载保存,以mp4文件的复制为例简述
with open("demo.mp4", "rb") as file1, open("demo1.mp4", "wb") as file2:
file2.write(file1.read()) # 将从file1读取的二进制源码以二进制源码的形式存入file2
文件描述符¶
文件描述符是一些小的整数,对应于当前进程所打开的文件。例如,标准输入的文件描述符通常是0,标准输出是1,标准错误是2。之后被进程打开的文件的文件描述符会被依次指定为3,4,5等。当需要时,可以用 fileno() 可以获得 file object 所对应的文件描述符。需要注意的是,直接使用文件描述符会绕过文件对象的方法,会忽略如数据内部缓冲等情况。
file.open()返回的file object内部包含了对应的文件描述符,所以两者在功能上等价
file1 = open("FPKM.txt", "r", encoding="utf-8") # 进程中第一个文件打开
print(file1.fileno()) # 输出后文件未关闭:3
file2 = open("demo.mp4", "rb") # 进程中第二个文件打开
print(file2.fileno()) # 输出后文件未关闭:4
file1.close() # 第一个文件关闭
file2.close() # 第二个文件关闭
file1 = open("FPKM.txt", "r", encoding="utf-8") # 进程中第一个文件打开
print(file1.fileno()) # 输出:3
file1.close() # 第一个文件关闭,进程中此时无文件打开
file2 = open("demo.mp4", "rb") # 仍是进程中第一个文件打开
print(file2.fileno()) # 输出:3
file2.close() # 仍是第一个文件关闭,进程中此时无文件打开





