Skip to content

打开与关闭

open和close

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

打开 file 并返回对应的文件对象file object。 如果该文件不能被打开,则引发 OSError(如文件已被其它程序打开或上一次程序未结束同时未关闭文件等)

  1. file:必选,将要打开的文件的路径(绝对路径或者相对当前工作目录的路径)

  2. 系统路径:指从系统资源管理器直接复制来的文件路径,以反斜杠("\")分级。如"D:\OneDrive\文档\8.Py_Project\TEMP\Temp\FPKM.txt"

  3. 输入路径:指python代码编写时应传入的文件路径,以正斜杠("/", "\")分级。如"D:/OneDrive/文档/8.Py_Project/TEMP/Temp/FPKM.txt" 或 "D:\OneDrive\文档\8.Py_Project\TEMP\Temp\FPKM.txt"(因为"\"在python中被解释为转义符)

  4. 绝对路径:指从磁盘根目录一直到文件名的完整路径,如上

  5. 相对路径:指相对于所执行python文件所在目录的路径,以"./"表示当前目录,如"./FPKM.txt",同目录时可直接省略用文件名,如直接用"FPKM.txt"

image.png

  1. mode:指明文件打开模式的可选字符串,可选。常见"r"(默认,文本模式读取,等价于"rt")、"rb"(二进制模式读取)、"r+"(读取并同时写入)、"w"(文本模式覆盖写入,等价于"wt")、"wb"(二进制模式写入)、"a+"(文本模式追加写入同时读取)等,见后
模式 含义
"r" 读取(默认),文件不存在则报错
"w" 覆盖写入,文件不存在则创建
"a" 追加写入,文件不存在则创建
"x" 创建写入,文件存在则报错
"t" 文本模式(默认),用于文本文件的读写
"b" 二进制模式,用于流文件如mp4、mp3、xlsx、docx、pdf、exe等文件的二进制读写
"+" 同时读写
  1. buffering:略

  2. encoding:只在文本模式下使用,可选。将文件的二进制源码按指定编码格式进行编码解码,文件是以什么编码格式储存的就设置为什么编码格式,以防出现乱码和报错,常用"utf-8"。默认使用的编码格式依赖于具体平台,可能是"GBK"。

  3. errors:只在文本模式下使用,可选,一般不传入参数。用于指定如何处理编码和解码错误

  4. "strict":默认。存在编码错误时会引发 ValueError 异常

  5. "ignore":忽略编码错误,可能会导致数据丢失

  6. "replace":将替换标记(例如 '?' )插入有错误数据的地方

  7. "surrogateescape":把任何不正确的字节表示为 U+DC80 至 U+DCFF 范围内的下方替代码位。 当在写入数据时使用 surrogateescape 错误处理器时这些替代码位会被转回到相同的字节。 这适用于处理具有未知编码格式的文件。

  8. "xmlcharrefreplace":仅在写入文件时才受到支持。 编码格式不支持的字符将被替换为相应的 XML 字符引用 &#nnn;

  9. "backslashreplace":用Python的反向转义序列替换格式错误的数据

  10. "namereplace":只在编写时支持,用 \N{...} 转义序列替换不支持的字符

  11. newline:只在文本模式下使用,可选,一般不传入参数。决定如何解析文件的换行符。 它可以为 None, '', '\n', '\r''\r\n'。见file.tell()

  12. closefd:略

  13. 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(缩进结束,文件操作结束,文件自动关闭)

读取

FPKM.txt

read

file.read(size)

从文本指针处(一般打开文件时指针位置在文本开头)开始读取整个文本,读取的内容形成一个字符串(文本模式),或字节串对象(二进制模式)

  1. size:指定读取内容的长度

  2. 省略或负数:默认为-1,读取并返回整个文本内容

  3. 文本模式:读取并返回最多前size个字符

  4. 二进制模式:读取并返回最多前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)

从文本指针处开始读取一行,到换行符结束(包括换行符),形成一个字符串

  1. limit:指定读取内容的长度

  2. 省略或负数:默认为-1,读取并返回整行内容

  3. 文本模式:读取并返回最多该行前size个字符

  4. 二进制模式:读取并返回最多该行前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)

从文本指针处开始读取所有行,每行到换行符结束,将每一行作为字符串元素存入列表

  1. 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

image.png

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"])

前两个操作结果结果同上,第三个操作结果如下:

image.png

文本指针

每次打开文件时,文本的指针都在文件的开头(位置为0),在文件的读写操作过程中,指针发生移动,也可以指定指针的位置。

tell

file.tell()

返回当前文件指针的位置,以字节为单位。

注意文本文件打开后右下方状态栏显示,根据编码模式与newline参数(一般不传,使用默认)决定换行符的显示与字节占用情况。若为"UTF-8"的"CRLF"模式(文本文件创建时的默认模式),换行符"\n"被解释为"\n\r"(输出还是"\n"),占两个字节,汉字占3个字节;若为"LF模式",换行符仍解释为"\n",占一个字节,汉字占两个字节。 上述文本文件为默认模式。

image.png

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 偏移量,计算并改变指针位置

  1. offset:相对参考点的偏移量,单位为字节。

  2. whence:参考点。文本模式下唯一有效值为0或file.tell()返回值

  3. 0:默认,表示从文件开头计算

  4. 1:表示使用当前指针位置。文本模式不可用。

  5. 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

image.png

image.png

demo.mp4

demo1.mp4

文件描述符

文件描述符是一些小的整数,对应于当前进程所打开的文件。例如,标准输入的文件描述符通常是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()                                      # 仍是第一个文件关闭,进程中此时无文件打开

Comments