Python

Python 知识量:10 - 41 - 150

8.2 读写文件><

文件简介- 8.2.1 -

文件通常存储在硬盘、U盘等存储设备中,是一个命名的比特集合。文件可以分为:文本文件和二进制文件。文本文件可以视为存储在硬盘中的一系列字符串;二进制文件指文本文件之外的文件,例如:图像、音频、视频等文件。

文本文件具有以下特点:

  • 通常由字符串构成,例如:Python源代码文件、HTML文件等。

  • 可以使用文本编辑器查看和编辑,对人的阅读和修改比较友好。

  • 对程序来说不太友好,读写需要额外的分析程序。

  • 通常比等价的二进制文件大。

二进制文件具有以下特点:

  • 对人的使用不友好,无法通过文本编辑器查看修改,在编辑器中是一堆乱码。如果要查看二进制文件,需要特定程序或工具,例如:通过图片软件打开图片文件。

  • 通常比等价的文本文件小,因为二进制文件不需要逗号、空格等分隔符,存储空间利用率更高。

  • 对程序友好,程序在计算机中本来就是以二进制形式运行的,二进制文件使用时不需要进行复杂的解析过程。

  • 与特定程序密切关联,特定格式的数据只有对应的程序可以使用。

文件夹- 8.2.2 -

在文件系统中,除了文件,还有文件夹的概念。实际上,文件夹代表的就是目录。文件夹(目录)结构通常比较庞大和复杂,有层次结构。

路径名用于标识文件或文件夹的名称。例如在Windows系统中的某个文件夹的路径名可能为:D:\PythonTestFile。Windows系统路径名使用反斜杠(\)来分割各文件夹或文件的名称,并以盘符(D:)打头;Linux系统中的路径名则以斜杠(/)来分割,也不使用盘符打头。

当前工作目录- 8.2.3 -

当前工作目录是一个重要的概念,通常指默认目录,是系统目前执行的位置。在操作文件或文件夹时,如果仅给出其名称,没有指定完整路径名,Python就会使用当前工作目录中的对应文件或文件夹。

检查文件和文件夹- 8.2.4 -

Python提供了许多用于查看文件和文件夹信息的函数,如下所示:

函数名功能说明
os.getcwd()返回当前工作目录名称。
os.listdir(p)返回一个字符串列表,其中包含路径p指定的文件夹中所有文件和文件夹的名称。
os.chdir(p)将当前工作目录设置为路径p
os.path.isfile(p)当路径p指向的是一个文件时返回True,否则返回False。
os.path.isdir(p)当路径p指向的是一个文件夹时返回True,否则返回False。
os.stat(fname)返回fname的信息,例如:大小、最后一次修改时间等。

下面是一些应用示例。

1、获取当前工作目录中的文件和文件夹。

# list.py
import os
def l_cwd():
    return os.listdir(os.getcwd())

运行结果为:

>>> 
====================== RESTART: D:\PythonTestFile\list.py ======================
>>> l_cwd()
['continue.py', 'done.py', 'list.py', 'local.py', 'match.py', 'multiplication.py', 
'__pycache__']

可以通过列表解析来识别文件和文件夹,分别打印:

# list.py
import os
def l_cwd():
    return os.listdir(os.getcwd())
def file_cwd():
    print([p for p in l_cwd() if os.path.isfile(p)])
def folder_cwd():
    print([p for p in l_cwd() if os.path.isdir(p)])

运行结果为:

>>> 
====================== RESTART: D:\PythonTestFile\list.py ======================
>>> file_cwd()
['continue.py', 'done.py', 'list.py', 'local.py', 'match.py', 'multiplication.py']
>>> folder_cwd()
['__pycache__']

2、获取.py文件。

# list.py
import os
def get_py(path=None):
    if path==None:
        path=os.getcwd()
    else:
        os.chdir(path)  #修改当前工作目录
        path=os.getcwd()
    print([fname for fname in os.listdir(path)
              if os.path.isfile(fname)
              if fname.endswith('.py')])

运行结果为:

>>> 
====================== RESTART: D:\PythonTestFile\list.py ======================
>>> get_py()
['continue.py', 'done.py', 'list.py', 'local.py', 'match.py', 'multiplication.py']
>>> get_py('D:\Python38\Lib\collections')
['abc.py', '__init__.py']

函数get_py()接受一个路径参数,默认是None,这时指向当前工作目录。如果给出了特定路径,则通过os.chdir()函数修改当前工作目录,指向特定路径。函数体中,通过列表解析筛选出.py文件并打印。

3、返回当前工作目录中所有文件的大小总和。

# list.py
import os
def l_cwd():
    return os.listdir(os.getcwd())
def file_cwd():
    return [p for p in l_cwd() if os.path.isfile(p)]
def size_in_bytes(f):
    return os.stat(f).st_size
def get_size():
    print(sum(size_in_bytes(f) for f in file_cwd()))

运行结果为:

>>> 
====================== RESTART: D:\PythonTestFile\list.py ======================
>>> get_size()
1668

微信截图_20210312115859.png

以上的代码中使用了大量的函数,函数间通过相互调用实现功能。推荐这样的编码方式,因为,这让程序更加简洁、易于理解和维护,并且可以重复使用。