18.5. 处理文件-目录和数据

学习大纲:

  • 使用os 模块处理目录。

  • 复制、移动、重命名和删除文件。

  • 使用路径。

  • 比较数据。

  • 合并数据。

  • 用模式匹配文件和目录。

  • 元数据:数据的数据。

  • 压缩和解压。

  • 使用tarfile 模块创建TAR文件。

  • 使用tarfile 模块查看TAR文件的内容。

目录或文件夹是指一组子目录和文件的集合。os 模块提供各种函数,允许开发者与操作系统进行交互。

18.5.1. 1.使用os模块处理目录

1.1 目录操作

os.getcwd()                                             # 获取工作目录
os.chdir('/home/student/work')                                 # 更改目录
os.listdir()                                                 # 列出目录
os.rename('work', 'work1')                                     # 重命名目录

1.2 复制、移动、重命名和删除文件

shutil.copy('hello.py', 'welcome.py')                                     # 复制文件
shutil.move('/home/student/sample.txt', '/home/student/Desktop/.')      #移动文件
shutil.move('hello.py', 'hello_renamed.py')                         # 重命名文件
os.remove('sample.txt')                                           # 删除文件
os.rmdir('work1')                                                 # 删除文件夹

1.3 使用路径

os.path.absname(path): 返回绝对路径,包含文件名。
os.path.dirname(path): 返回路径,不包含文件名。
os.path.basename(path): 返回文件名,不包含路径。
os.path.exists(path): 如果存在该文件或路径,则返回True 。
os.path.getsize(path): 返回文件大小,以字节为单位。
os.path.isfile(path): 检查输入是否是一个文件,若是则返回True
os.path.isdir(path): 检查输入是否是一个目录,若不是,则返回False

18.5.2. 2.比较数据

Pandas是一个开源的数据分析库,提供易于使用的数据结构和数据分析工具。它让数据的导入和分析变得更加容易。

pip3 install pandas     --- For Python3

compare_data.py

import pandas as pd
df1 = pd.read_csv("student1.csv")
df2 = pd.read_csv("student2.csv")

s1 = set([ tuple(values) for values in df1.values.tolist()])
s2 = set([ tuple(values) for values in df2.values.tolist()])

s1.symmetric_difference(s2)

print (pd.DataFrame(list(s1.difference(s2))), '\n')
print (pd.DataFrame(list(s2.difference(s1))), '\n')

上面的示例程序比较了两个csv 文件student1.csvstudent2.csv 之间的数据。首先将数据帧(df1,df2 )转换为集合(s1,s2),然后使用了symmetric_difference() 函数检查s1s2 之间的差异,最后输出结果。

18.5.3. 3.合并数据

merge_data.py

import pandas as pd

df1 = pd.read_csv("student1.csv")
df2 = pd.read_csv("student2.csv")
result = pd.concat([df1, df2])

print(result)

18.5.4. 4.用模式匹配文件和目录

Python拥有glob 模块,用于查找与特定模式匹配的文件和目录名称。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @auther:   18793
import glob

file_match = glob.glob("*.py")
print(file_match)

file_match = glob.glob('[a-z]*.txt')
print(file_match)

# If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories.
file_match = glob.glob('**/*.txt', recursive=True)
print(file_match)

file_match = glob.glob('**/', recursive=True)
print(file_match)

第一个glob() 函数的pathname*.txt ,表示返回所有扩展名为txt 的文件名。

第二个glob() 函数的pathname[0-9].txt ,表示返回以数字开头的文件名。

第三个glob() 函数的pathname**/*.txt ,它将返回文件名和目录名。

第四个glob() 函数的pathname**/ ,它只返回目录名。

18.5.5. 5.元数据:数据的数据

PyPdf 模块,它用于从PDF文件中获取元数据。首先,什么是元数据?元数据是关于数据的数据。元数据是指描述一组数据的结构化信息,同时也是该组数据的摘要。它包含有关实际数据的基本信息,这有助于查找特定的数据。

首先我们需要安装PyPdf 模块,如下所示。

pip install pyPdf

metadata_example.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyPdf


def main():
    file_name = '/home/student/sample_pdf.pdf'

    pdfFile = pyPdf.PdfFileReader(file(file_name, 'rb'))

    pdf_data = pdfFile.getDocumentInfo()

    print("----Metadata of the file----")

    for md in pdf_data:
        print(md + ":" + pdf_data[md])


if __name__ == '__main__':
    main()

上面的脚本程序使用了Python 2的PyPdf 模块。首先创建了一个变量file_name 来存储PDF文件的路径。接下来使用了PdfFileReader() 读取数据。然后创建了一个变量pdf_data 来保存有关PDF的数据。最后编写了一个for 循环来获取元数据。

18.5.6. 6.压缩和解压

6.1 shutil压缩

shutil模块的make_archive() 函数,它用于压缩指定目录中的所有文件。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import shutil

shutil.make_archive("bbb", "zip", "bbb")
shutil.make_archive("bbb", "tar", "bbb")

shutil.make_archive() 函数的第一个参数bbb 指定被压缩文件的名称,第二个参数zip 指定压缩格式,第三个参数bbb/ 表示被压缩文件所在目录的名称。

6.2 shutil解压缩

要从压缩文件中解压数据,我们可以使用shutil 模块中的unpack_archive() 函数。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import shutil

shutil.unpack_archive("bbb.zip")
shutil.unpack_archive("bbb.zip",extract_dir="./bbb")

18.5.7. 7.使用tarfile模块创建TAR文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tarfile

tar_file = tarfile.open("work.tar.gz", "w:gz")

for name in ["list_dir.py", "take_backup.py"]:
    tar_file.add(name)

tar_file.close()

18.5.8. 8.使用tarfile模块查看TAR文件的内容

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tarfile

tar_file = tarfile.open("work.tar.gz", "r:gz")
print(tar_file.getnames())

tarfile 模块查看创建的TAR文件的内容。其中,使用了getnames() 函数来读取数据。

18.5.9. 总结

我们学习了如何编写处理文件和目录的Python脚本程序,还学习了如何使用os 模块来处理目录。然后学习了如何复制、移动、重命名和删除文件,

并了解了Python中的Pandas模块,它可以用于比较和合并数据。最后学习了如何使用tarfile 模块创建TAR文件和查看TAR文件的内容,并且学习了如何在搜索文件和目录时进行模式匹配。