关于文件,有两个关键属性,分别是“文件名”和“路径”。文件名指的是为每个文件设定的名称,路径用来指明文件在计算机上的位置
在 Windows 上,路径书写使用反斜杠 “\” 作为文件夹之间的分隔符,在 OS X 和 Linux 上,使用正斜杠 “/” 作为路径分隔符
每个运行在计算机上的程序,都有一个“当前工作目录”(cwd)。所有没有从根文件夹开始的文件名或路径,都假定在当前工作目录下
当前工作目录(当前目录)是标准术语,没有当前工作文件夹这种说法
在Python中利用 os.getcwd() 函数取得当前工作路径的字符串
>>> import os
>>> os.getcwd()
'F:\\Python'
利用 os.chdir() 改变当前工作路径的字符串
>>> os.chdir('C:\\Program Files (x86)')
>>> os.getcwd()
'C:\\Program Files (x86)'
如果使用 os.chdir() 修改的工作目录不存在,解释器会报错
os.chdir('C:\\Program')
FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'C:\\Program'
绝对路径:从根文件夹开始,Windows 系统以盘符(C:)作为根文件夹, OS X 或 Linux 系统中 / 作为根文件夹
相对路径:文件相对于当前工作目录所在的位置
若当前工作目录为 “C:\Program Files (x86)”,文件 demo.txt 就位于这个Program Files (x86)文件夹下,则 demo.txt 的相对路径表示为 “.\demo.txt”( .\ 表示当前所在目录)
使用相对路径表示文件所在的位置时,用 .\ 表示当前所在目录,用 …\ 表示当前所在目录的父目录
os.path 模块的一些函数,可以实现绝对路径和相对路径之间的转换,检查给定的路径是否为绝对路径
os.path.abspath(path) :返回 path 参数的绝对路径的字符串
os.path.isabs(path) :如果参数是一个绝对路径,返回 True,如果参数是一个相对路径,返回 False
os.path.relpath(path, start) :返回从 start 路径到 path 的相对路径的字符串。若没有提供 start,使用当前工作目录作为开始路径。
os.path.dirname(path) :返回一个字符串,包含 path 参数中最后一个斜杠之前的所有内容
os.path.basename(path) :返回一个字符串,包含 path 参数中最后一个斜杠之后的所有内容
将相对路径转换为绝对路径的简便方法
>>> os.path.abspath('.\\Scripts')
'C:\\Program Files (x86)\\Scripts'
参数是绝对路径,返回 True
>>> os.path.isabs('.')
False
参数是相对路径,返回 False
>>> os.path.isabs(os.path.abspath('.')) #利用abspath将相对路径转换为绝对路径
True
从 start 路径到 path 的相对路径的字符串
>>> os.path.relpath('C:\\Windows', 'C:\\')
'Windows'
如果没有提供 start,使用当前工作目录作为开始路径
>>> path = 'C:\\Program Files (x86)'
>>> os.path.basename(path) # path参数最后一个斜杠之后的所有内容
'Program Files (x86)'
>>> os.path.dirname(path) # path参数最后一个斜杠之前的所有内容
'C:\\'
路径的目录名称和基本名称,可调用 os.path.split() 获得这两个字符串的元组
>>> path = 'C:\\Program Files (x86)'
>>> os.path.split(path)
('C:\\', 'Program Files (x86)')
os.path 模块提供了函数用于检测给定的路径是否存在
path 参数所指的文件或文件夹存在,调用os.path.exists(path) 返回 True,否则返回 False
path 参数存在并且是一个文件,调用 os.path.isfile(path) 返回 True,否则返回 False
path 参数存在并且是一个文件夹,调用 os.path.isdir(path) 返回 True,否则返回 False
>>> os.path.exists('C:\\Windows')
True
>>> os.path.exists('C:\\Win')
False
>>> os.path.isfile('C:\\Windows\\System32')
False
>>> os.path.isfile('C:\\Windows\\System32\\C_20280.NLS')
True
>>> os.path.isdir('C:\\Windows\\System32\\C_20280.NLS')
False
>>> os.path.isdir('C:\\Windows\\System32')
True
文件的常见的操作包括创建、删除、修改权限、读取、写入等
文件的系统级操作:功能单一,比较容易实现,可以借助 Python 中的专用模块(os,sys等),并调用模块中的指定函数来实现
文件的应用级操作:通常需要按照固定的步骤进行操作,且实现过程相对比较复杂
应用级操作:
打开文件:使用 open() 函数,该函数会返回一个文件对象
对已打开文件做读/写操作:借助对应的函数实现
关闭文件:完成对文件的操作之后,使用 close() 函数关闭文件
*一个文件,必须在打开之后才能对其进行操作,并且在操作结束之后应该将其关闭,顺序不能打乱
open() 函数用于创建或打开指定文件
file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]])
用 [] 括起来的部分为可选参数
file:表示要创建的文件对象
file_name:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号)
mode:可选参数,用于指定文件的打开模式,如果不写,默认以只读(r)模式打开文件
buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区
encoding:手动设定打开文件时所使用的编码格式,不同平台的 ecoding 参数值不同,如 Windows 系统默认为 cp936( GBK 编码)
模式 | 意义 |
---|---|
r | 只读模式打开文件,读写文件的指针会放在文件的开头 |
rb | 以二进制格式、采用只读模式打开文件,指针位于文件的开头,一般用于非文本文件(图片文件、音频文件等) |
r+ | 打开文件后,可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容 |
rb+ | 以二进制格式、采用读写模式打开文件,指针会放在文件的开头,一般用于非文本文件(图片文件、音频文件等) |
*上述模式操作的文件必须存在
模式 | 意义 |
---|---|
w | 以只写模式打开文件,若该文件存在,打开文件后,会对原有内容进行清空 |
wb | 以二进制格式、只写模式打开文件,一般用于非文本文件 |
w+ | 打开文件后,会对原有内容进行清空,并对该文件有读写权限 |
wb+ | 以二进制格式、读写模式打开文件,一般用于非文本文件 |
a | 以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,指针将放在文件的末尾(新写入内容会位于已有内容之后);反之,会创建新文件 |
ab | 以二进制格式打开文件,采用追加模式,对文件只有写权限。如果该文件已存在,指针位于文件末尾;反之,创建新文件 |
a+ | 以读写模式打开文件;如果文件存在,指针放在文件的末尾;反之,创建新文件 |
ab+ | 以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,指针位于文件的末尾;反之,创建新文件 |
*上述模式下若文件存在,会覆盖文件;反之,创建新文件
文件打开模式决定了后续可以对文件做哪些操作,使用 r 模式打开的文件,后续编写的代码只能读取文件,而无法修改文件内容
要打开的文件和当前执行的代码文件位于同一目录,可直接写文件名;否则,需要指定打开文件所在的完整路径
以默认模式打开文件时,默认使用 r 权限,该权限要求打开的文件必须存在
file = open("a.txt")
print(file)
FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'
在程序文件同目录下,手动创建一个 a.txt 文件
file = open("a.txt")
print(file)
<_io.TextIOWrapper name='a.txt' mode='r' encoding='cp936'>
使用 open() 打开文件时,默认采用 GBK 编码,可以在使用 open() 函数时,手动指定打开文件的编码格式
file = open("a.txt",encoding="utf-8")
手动修改 encoding 参数的值,仅限于文件以文本的形式打开,以二进制格式打开时,不能对 encoding 参数的值做任何修改,否则会出现 ValueError 异常
缓冲区(buffer):是内存空间的一部分,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据
如果 buffing 参数的值为 0(或 False),表示在打开指定文件时不使用缓冲区
如果 buffing 参数值为大于 1 的整数,该整数用于指定缓冲区的大小(字节)
如果 buffing 参数的值为负数,代表使用默认的缓冲区大小
在使用 open() 函数时打开缓冲区,不需要修改 buffing 参数的值
目前计算机内存的 I/O 速度远远高于计算机外设(键盘、鼠标、硬盘等)的 I/O 速度,如果不使用缓冲区,程序在执行 I/O 操作时,内存和外设就必须进行同步读写操作
内存必须等待外设输入(输出)一个字节之后,才能再次输出(输入)一个字节,内存中的程序大部分时间都处于等待状态
使用缓冲区,程序在执行输出操作时,会先将所有数据都输出到缓冲区中,然后继续执行其它操作,缓冲区中的数据会有外设自行读取处理
当程序执行输入操作时,会先等外设将数据读入缓冲区中,无需同外设做同步读写操作
I/O(Input/Output),输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出
打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息:
file.name:文件的名称
file.mode:打开文件时,采用的文件打开模式
file.encoding:打开文件时使用的编码格式
file.closed:判断文件是否己经关闭
f = open('a.txt') # 以默认方式打开文件
print(f.closed) # 输出文件是否已经关闭
print(f.mode) # 输出访问模式
print(f.encoding) #输出编码格式
print(f.name) # 输出文件名
False
r
cp936
a.txt
使用 open() 函数打开的文件对象,必须手动进行关闭,Python垃圾回收机制无法自动回收打开文件所占用的资源