Python入门(二十三)- 文件操作1

二十三、文件操作

23.1 文件基础知识

当程序运行时,变量是保存数据的好方法,但变量、序列以及对象中存储的数据是暂时的,程序结束后就会丢失,如果希望程序结束后数据仍然保持,就需要将数据保存到文件中。Python 提供了内置的文件对象,以及对文件、目录进行操作的内置模块,通过这些技术可以很方便地将数据保存到文件(如文本文件等)中。

关于文件,它有两个关键属性,分别是“文件名”和“路径”。

  • 文件名指的是为每个文件设定的名称,
  • 路径则用来指明文件在计算机上的位置。

23.1.1 不同系统的区别

Windows系统与Linux系统区别:
1.根目录不同

  • 在 Windows 中,根文件夹名为 类似(C:\)这样的结构,也称为 C: 盘。
  • 在 OS X 和 Linux 中,根文件夹是 /。
  1. 附加卷表示不同
    附加卷是除系统硬盘外,额外挂载的存储介质(诸如 DVD 驱动器或 USB 闪存驱动器)
  • 在 Windows 上,它们表示为新的、带字符的根驱动器。诸如 D:\ 或 E:\。
  • 在 OS X 上,它们表示为新的文件夹,在 /Volumes 文件夹下。
  • 在 Linux 上,它们表示为新的文件夹,在 /mnt 文件夹下。
    同时也要注意,虽然文件夹名称和文件名在 Windows 和 OS X 上是不区分大小写的,但在 Linux 上是区分大小写的。
  1. 文件路径表示方式不同
  • 在 Windows 上,路径书写使用反斜杠 “” 作为文件夹之间的分隔符。
  • 在 OS X 和 Linux 上,使用正斜杠 “/” 作为它们的路径分隔符。
    如果想要程序运行在所有操作系统上,在编写 Python 脚本时,就必须处理这两种情况。
    好在,用 os.path.join() 函数来做这件事很简单。如果将单个文件和路径上的文件夹名称的字符串传递给它,os.path.join() 就会返回一个文件路径的字符串,包含正确的路径分隔符。在交互式环境中输入以下代码:
>>> import os
>>> os.path.join('demo', 'exercise')
'demo\\exercise'

因为此程序是在 Windows 上运行的,所以 os.path.join(‘demo’, ‘exercise’) 返回 ‘demo\exercise’(请注意,反斜杠有两个,因为每个反斜杠需要由另一个反斜杠字符来转义)。如果在 OS X 或 Linux 上调用这个函数,该字符串就会是 ‘demo/exercise’。

不仅如此,如果需要创建带有文件名称的文件存储路径,os.path.join() 函数同样很有用。例如,下面的例子将一个文件名列表中的名称,添加到文件夹名称的末尾:

import os
myFiles = ['accounts.txt', 'details.csv', 'invite.docx']
for filename in myFiles:
    print(os.path.join('C:\\demo\\exercise', filename))
运行结果为:
C:\demo\exercise\accounts.txt
C:\demo\exercise\details.csv
C:\demo\exercise\invite.docx

23.1.2 Python路径引用

  1. 当前工作目录
    每个运行在计算机上的程序,都有一个“当前工作目录”(或 cwd)。所有没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。
    通常程序的当前工作目录为程序所在目录。
    在 Python 中,利用 os.getcwd() 函数可以取得当前工作路径的字符串,还可以利用 os.chdir() 改变它。例如,在交互式环境中输入以下代码:
>>> import os
>>> os.getcwd()
'C:\\Users\\mAdministrator\\Desktop'
>>> os.chdir('C:\\Windows\\System32')
>>> os.getcwd()
'C:\\Windows\\System32'

可以看到,原本当前工作路径为 ‘C:\Users\Administrator\Desktop’(也就是桌面),通过 os.chdir() 函数,将其改成了 ‘C:\Windows\System32’。

需要注意的是,如果使用 os.chdir() 修改的工作目录不存在,Python 解释器会报错,例如:

>>> os.chdir('C:\\error')
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    os.chdir('C:\\error')
FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'C:\\error'

了解了当前工作目录的具体含义之后,接下来介绍绝对路径和相对路径各自的含义和用法。

  1. 绝对路径与相对路径
    明确一个文件所在的路径,有 2 种表示方式,分别是:
  • 绝对路径:总是从根文件夹开始,Window 系统中以盘符(C:、D:)作为根文件夹,而 OS X 或者 Linux 系统中以 / 作为根文件夹。
  • 相对路径:指的是文件相对于当前工作目录所在的位置。例如,当前工作目录为 “C:\Windows\System32”,若文件 demo.txt 就位于这个 System32 文件夹下,则 demo.txt 的相对路径表示为 “.\demo.txt”(其中 .\ 就表示当前所在目录)。

在使用相对路径表示某文件所在的位置时,除了经常使用 .\ 表示当前所在目录之外,还会用到 …\ 表示当前所在目录的父目录。
Python提供处理路径的模块,后续我们会讲解。

23.1.3 文件操作

Python 中,对文件的操作有很多种,常见的操作包括创建、删除、修改权限、读取、写入等,这些操作可大致分为以下 2 类:

  • 删除、修改权限:作用于文件本身,属于系统级操作。
  • 写入、读取:是文件最常用的操作,作用于文件的内容,属于应用级操作。

其中,对文件的系统级操作功能单一,比较容易实现,可以借助 Python 中的专用模块(os、sys 等),并调用模块中的指定函数来实现。例如,假设如下代码文件的同级目录中有一个文件“a.txt”,通过调用 os 模块中的 remove 函数,可以将该文件删除,具体实现代码如下:
import os
os.remove(“a.txt”)
有关使用 os 模块操作文件更详解的介绍,可阅读《Python os模块》一节。

而对于文件的应用级操作,通常需要按照固定的步骤进行操作,且实现过程相对比较复杂,同时也是本章重点要讲解的部分。

文件的应用级操作可以分为以下 3 步,每一步都需要借助对应的函数实现:
打开文件:使用 open() 函数,该函数会返回一个文件对象;
对已打开文件做读/写操作:读取文件内容可使用 read()、readline() 以及 readlines() 函数;向文件中写入内容,可以使用 write() 函数。
关闭文件:完成对文件的读/写操作之后,最后需要关闭文件,可以使用 close() 函数。

一个文件,必须在打开之后才能对其进行操作,并且在操作结束之后,还应该将其关闭,这 3 步的顺序不能打乱。
以上操作文件的各个函数,会各自作为一节进行详细介绍。

23.2 操作路径及相关模块

23.2.1 pathlib模块

pathlib模块提供了一组面下那个对象的类,这些类可代表各种操作系统上的路径,程序可通过这些类操作路径。
在这里插入图片描述
pathlib 模块的操作对象是各种操作系统中使用的路径(例如指定文件位置的路径,包括绝对路径和相对路径)。这里简单介绍一下上图 中包含的几个类的具体功能:

  • PurePath 类会将路径看做是一个普通的字符串,它可以实现将多个指定的字符串拼接成适用于当前操作系统的路径格式,同时还可以判断任意两个路径是否相等。注意,使用 PurePath 操作的路径,它并不会关心该路径是否真实有效。
  • PurePosixPath 和 PureWindowsPath 是 PurePath 的子类,前者用于操作 UNIX(包括 Mac OS X)风格的路径,后者用于操作 Windows 风格的路径。
  • Path 类和以上 3 个类不同,它操作的路径一定是真实有效的。Path 类提供了判断路径是否真实存在的方法。
  • PosixPath 和 WindowPath 是 Path 的子类,分别用于操作 Unix(Mac OS X)风格的路径和 Windows 风格的路径。
23.2.1.1 PurePath类

PurePath 类(以及 PurePosixPath 类和 PureWindowsPath 类)都提供了大量的构造方法、实例方法以及类实例属性,供我们使用。

  1. PurePath类构造方法
    需要注意的是,在使用 PurePath 类时,考虑到操作系统的不同,如果在 UNIX 或 Mac OS X 系统上使用 PurePath 创建对象,该类的构造方法实际返回的是 PurePosixPath 对象;反之,如果在 Windows 系统上使用 PurePath 创建对象,该类的构造方法返回的是PureWindowsPath 对象。
    当然,我们完全可以直接使用 PurePosixPath 类或者 PureWindowsPath 类创建指定操作系统使用的类对象。

例如,在 Windows 系统上执行如下语句:

>>> from pathlib import *
>>> pa = PurePath('setup.py')
>>> print(type(pa))
<class 'pathlib.PureWindowsPath'>
>>> # 可以看到输出的是PureWindowsPath对象,
>>> pa = PurePath('test1','test2','test3')
>>> print (pa)
test1\test2\test3
>>> #可以看到模块自动将多个单路径字符串组合成Windows风格的路径
>>> pa = PurePath(Path('test1'),Path('test2'))
>>> print(pa)
test1\test2
>>> #使用完整模式组合字符串
>>> pa = PurePosixPath('test1','test2')
>>> #创建Unix风格的路径字符串
>>> print(pa)
test1/test2

显然,在 Windows 操作系统上,使用 PurePath 类构造函数创建的是 PureWindowsPath 类对象。

可以看到,由于本机为 Windows 系统,因此这里输出的是适用于 Windows 平台的路径。如果想在 Windows 系统上输出 UNIX 风格的路径字符串,就需要使用 PurePosixPath 类。

值的一提的是,如果在使用 PurePath 类构造方法时,不传入任何参数,则等同于传入点‘.’(表示当前路径)作为参数。例如:

from pathlib import *
path = PurePath()
print(path)
path = PurePath('.')
print(path)
程序执行结果为:
.
.

另外,如果传入 PurePath 构造方法中的多个参数中,包含多个根路径,则只会有最后一个根路径及后面的子路径生效。例如:

from pathlib import *
path = PurePath('C://','D://','my_file.txt')
print(path)
程序执行结果为:
D:\my_file.txt

注意,对于 Windows 风格的路径,只有盘符(如 C、D等)才能算根路径,仅有/是不算的。
需要注意的是,如果传给 PurePath 构造方法的参数中包含有多余的斜杠或者点( . ,表示当前路径),会直接被忽略,但是 … 不会被忽略,…代表上一级路径。
根路径的字符串一定要带’'或‘/’,PurePath方法会自动转化为对应系统的字符串格式,但是如果不带,方法就无能为力了。举个例子:

from pathlib import *
path = PurePath('C://./my_file.txt')
print(path)
程序执行结果为:
C:\my_file.txt
>>> pa = PurePath('C::','Windows','..')
>>> print(pa)
C::\Windows\..
>>> pa = PurePath('C:','Windows','..','test')
>>> print(pa)
C:Windows\..\test
>>> pa = PurePath('C:/','Windows','..','test')
>>> print(pa)
C:\Windows\..\test    #相当于找Windows同一级的test路径

使用组合的方式构建路径,后面的字符一定不能待/或,否则会与你的预期不同

>>> p1 = PurePath('test1','/test2')
>>> print(p1)
\test2
>>> p1 = PurePath('test1','test2')
>>> print(p1)
test1\test2

PurePath 类还支持各种比较运算符,对于同种风格的路径字符串来说,可以判断是否相等,也可以比较大小(实际上就是比较字符串的大小);对于不同种风格的路径字符串之间,只能判断是否相等(显然,不可能相等),但不能比较大小,比较大小会系统报错TypeError。

举个例子:

from pathlib import *
# Unix风格的路径区分大小写
print(PurePosixPath('C://my_file.txt') == PurePosixPath('c://my_file.txt'))
# Windows风格的路径不区分大小写
print(PureWindowsPath('C://my_file.txt') == PureWindowsPath('c://my_file.txt'))
程序执行结果为:
False
True

比较特殊的是,PurePath 类对象支持直接使用斜杠(/)作为多个字符串之间的连接符,例如:

from pathlib import *
path = PurePosixPath('C://')
print(path / 'my_file.txt')
程序执行结果为:
C:/my_file.txt

注意:不能使用多层路径,加单层路径的形式构建PurePath

#与我们预期的不符
>>> p1 = PurePath('test1/test2/','/test3')
>>> print (p1)
\test3
#可以使用下面这种形式
>>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值