Skip to content

Latest commit

 

History

History
389 lines (253 loc) · 17.2 KB

File metadata and controls

389 lines (253 loc) · 17.2 KB

五、处理文件、目录和数据

系统管理员执行诸如处理各种文件、目录和数据等任务。在本章中,我们将学习os模块。os模块提供与操作系统交互的功能。Python 程序员可以很容易地使用这个os模块来执行文件和目录操作。os模块为程序员提供处理文件、路径、目录和数据的工具。

在本章中,您将了解以下内容:

  • 使用os模块处理目录
  • 复制、移动、重命名和删除数据
  • 使用路径、目录和文件
  • 比较数据
  • 合并数据
  • 模式匹配文件和目录
  • 元数据:关于数据的数据
  • 压缩与恢复
  • 使用tarfile模块创建 TAR 档案
  • 使用tarfile模块检查 TAR 文件的内容

使用操作系统模块处理目录

目录或文件夹是文件和子目录的集合。os模块提供各种功能,允许我们与操作系统交互。在本节中,我们将学习在使用目录时可以使用的一些函数。

获取工作目录

要开始使用目录,首先,我们将获得当前工作目录的名称。os模块有getcwd()功能,我们可以通过该功能获取当前工作目录。启动python3控制台,输入以下命令获取目录名:

$ python3 Python 3.6.5 (default, Apr  1 2018, 05:46:30) [GCC 7.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> os.getcwd() '/home/student' **>>** 

更改目录

使用os模块,我们可以更改当前的工作目录。为此,os模块具有chdir()功能,例如:

>>> os.chdir('/home/student/work') >>> print(os.getcwd()) /home/student/work >>> 

列出文件和目录

在 Python 中列出目录内容很容易。我们将使用os模块,该模块有一个名为listdir()的函数,它将从您的工作目录返回文件和目录的名称:

>>> os.listdir() ['Public', 'python_learning', '.ICEauthority', '.python_history', 'work', '.bashrc', 'Pictures', '.gnupg', '.cache', '.bash_logout', '.sudo_as_admin_successful', '.bash_history', '.config', '.viminfo', 'Desktop', 'Documents', 'examples.desktop', 'Videos', '.ssh', 'Templates', '.profile', 'dir', '.pam_environment', 'Downloads', '.local', '.dbus', 'Music', '.mozilla'] >>> 

重命名目录

Python 中的os模块有一个rename()函数,可以帮助更改目录的名称:

>>> os.rename('work', 'work1') >>> os.listdir() ['Public', 'work1', 'python_learning', '.ICEauthority', '.python_history', '.bashrc', 'Pictures', '.gnupg', '.cache', '.bash_logout', '.sudo_as_admin_successful', '.bash_history', '.config', '.viminfo', 'Desktop', 'Documents', 'examples.desktop', 'Videos', '.ssh', 'Templates', '.profile', 'dir', '.pam_environment', 'Downloads', '.local', '.dbus', 'Music', '.mozilla'] **>>** 

复制、移动、重命名和删除数据

我们将学习系统管理员对数据执行的四个基本操作,即复制、移动、重命名和删除。Python 有一个名为shutil的内置模块,可以执行这些任务。使用shutil模块,我们还可以对数据执行高级操作。要在程序中使用shutil模块,只需编写import shutil导入语句。shutil模块提供了一些支持文件复制和删除操作的功能。让我们逐一了解这些操作。

复制数据

在本节中,我们将了解如何使用shutil模块复制文件。为此,首先,我们将创建一个hello.py文件并在其中写入一些文本。

hello.py

print ("") print ("Hello World\n") print ("Hello Python\n")

现在,我们将编写复制到shutil_copy_example.py脚本中的代码。在其中写入以下内容:

import shutil import os shutil.copy('hello.py', 'welcome.py') print("Copy Successful")

按如下方式运行脚本:

$ python3 shutil_copy_example.py Output: Copy Successful

检查welcome.py脚本是否存在,您会发现hello.py的内容在welcome.py中复制成功。

移动数据

在这里,我们将看到如何移动数据。为此,我们将使用shutil.move()shutil.move(source, destination)将文件从源移动到目标。现在,我们将创建一个shutil_move_example.py脚本,并在其中写入以下内容:

import shutil shutil.move('/home/student/sample.txt', '/home/student/Desktop/.')

按如下方式运行脚本:

$ python3 shutil_move_example.py

在这个脚本中,我们要移动的文件是sample.txt,它位于/home/student目录中。/home/student是我们的源文件夹,/home/student/Desktop是我们的目标文件夹。因此,在运行脚本后,sample.txt将从/home/student移动到/home/student/Desktop目录。

重命名数据

在上一节中,我们学习了如何使用shutil.move()将文件从源移动到目标。使用shutil.move()可以重命名文件。创建一个shutil_rename_example.py脚本,并在其中写入以下内容:

import shutil shutil.move('hello.py', 'hello_renamed.py')

按如下方式运行脚本:

$ python3 shutil_rename_example.py

输出:

现在,检查您的文件名是否将被重命名为hello_renamed.py

删除数据

我们将学习如何使用 Python 中的os模块删除文件和文件夹。os模块的remove()方法将删除一个文件。如果您尝试使用此方法删除目录,它将为您提供一个OSError。要删除目录,请使用rmdir()

现在,创建一个os_remove_file_directory.py脚本,并在其中写入以下内容:

import os os.remove('sample.txt') print("File removed successfully") os.rmdir('work1') print("Directory removed successfully")

按如下方式运行脚本:

$ python3 os_remove_file_directory.py Output: File removed successfully Directory removed successfully

使用路径

现在,我们将学习os.path()。它用于路径操作。在本节中,我们将了解os模块为路径名提供的一些函数。

启动python3控制台:

student@ubuntu:~$ python3
Python 3.6.6 (default, Sep 12 2018, 18:26:19)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
<q>>></q>
  • os.path.absname(path):返回路径名的绝对版本。
>>> import os >>> os.path.abspath('sample.txt') '/home/student/work/sample.txt'
  • os.path.dirname(path):返回路径的目录名。
>>> os.path.dirname('/home/student/work/sample.txt') '/home/student/work'
  • os.path.basename(path):返回路径的基本名称。
>>> os.path.basename('/home/student/work/sample.txt') 'sample.txt'
  • os.path.exists(path):如果路径引用现有路径,则返回True
>>> os.path.exists('/home/student/work/sample.txt') True
  • os.path.getsize(path):返回输入路径的大小,以字节为单位。
>>> os.path.getsize('/home/student/work/sample.txt') 39
  • os.path.isfile(path):检查输入的路径是否为已有文件。如果是文件,则返回True
>>> os.path.isfile('/home/student/work/sample.txt') True
  • os.path.isdir(path):检查输入的路径是否为现有目录。如果是目录,则返回True
>>> os.path.isdir('/home/student/work/sample.txt') False

比较数据

在这里,我们将学习如何在 Python 中比较数据。为此,我们将使用pandas模块。

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

在开始本示例之前,请确保您的系统上安装了pandas。您可以按如下方式安装 pandas:

pip3 install pandas     --- For Python3 
or
 pip install pandas       --- For python2

我们将研究一个使用熊猫比较数据的例子。首先,我们将创建两个csv文件:student1.csvstudent2.csv。我们将比较这两个csv文件的数据,并在输出中返回比较结果。创建两个csv文件,如下所示:

创建student1.csv文件内容如下:

Id,Name,Gender,Age,Address 101,John,Male,20,New York 102,Mary,Female,18,London 103,Aditya,Male,22,Mumbai 104,Leo,Male,22,Chicago 105,Sam,Male,21,Paris 106,Tina,Female,23,Sydney

创建student2.csv文件内容如下:

Id,Name,Gender,Age,Address 101,John,Male,21,New York 102,Mary,Female,20,London 103,Aditya,Male,22,Mumbai 104,Leo,Male,23,Chicago 105,Sam,Male,21,Paris 106,Tina,Female,23,Sydney

现在,我们将创建一个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')

按如下方式运行脚本:

$ python3 compare_data.py Output:
 0     1       2   3         4 0  102  Mary  Female  18    London 1  104   Leo    Male  22   Chicago 2  101  John    Male  20  New York

 0     1       2   3         4 0  101  John    Male  21  New York 1  104   Leo    Male  23   Chicago 2  102  Mary  Female  20    London

在前面的示例中,我们正在比较两个csv文件:student1.csvstudent2.csv之间的数据。我们首先将数据帧(df1df2转换为集合(s1s2)。然后,我们使用了symmetric_difference()套装。因此,它将检查s1s2之间的对称差异,然后我们将打印结果。

合并数据

我们将学习如何在 Python 中合并数据。为此,我们将使用 Python 的 pandas 库。为了合并数据,我们将使用上一节中已经创建的两个csv文件student1.csvstudent2.csv

现在,创建一个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)

按如下方式运行脚本:

$ python3 merge_data.py Output:
 Id    Name  Gender  Age   Address 0  101    John    Male   20  New York 1  102    Mary  Female   18    London 2  103  Aditya    Male   22    Mumbai 3  104     Leo    Male   22   Chicago 4  105     Sam    Male   21     Paris 5  106    Tina  Female   23    Sydney 0  101    John    Male   21  New York 1  102    Mary  Female   20    London 2  103  Aditya    Male   22    Mumbai 3  104     Leo    Male   23   Chicago 4  105     Sam    Male   21     Paris 5  106    Tina  Female   23    Sydney

模式匹配文件和目录

在本节中,我们将学习文件和目录的模式匹配。Python 有glob模块,用于查找与特定模式匹配的文件和目录的名称。

现在,我们来看一个例子。首先,创建一个pattern_match.py脚本,并在其中写入以下内容:

import glob file_match = glob.glob('*.txt') print(file_match) file_match = glob.glob('[0-9].txt') print(file_match) file_match = glob.glob('**/*.txt', recursive=True) print(file_match) file_match = glob.glob('**/', recursive=True) print(file_match)

按如下方式运行脚本:

$ python3 pattern_match.py Output: ['file1.txt', 'filea.txt', 'fileb.txt', 'file2.txt', '2.txt', '1.txt', 'file.txt'] ['2.txt', '1.txt'] ['file1.txt', 'filea.txt', 'fileb.txt', 'file2.txt', '2.txt', '1.txt', 'file.txt', 'dir1/3.txt', 'dir1/4.txt'] ['dir1/']

在前面的示例中,我们使用 Python 的glob模块进行模式匹配。glob(路径名)将返回与路径名匹配的名称列表。在 out 脚本中,我们在三个不同的glob()函数中传递了三个路径名。在第一个glob()中,我们将路径名传递为*.txt;,这将返回所有扩展名为.txt的文件名。在第二个glob()中,我们通过了[0-9].txt;这将返回以数字开头的文件名。在第三个glob()中,我们传递了**/*.txt,它将返回文件名和目录名。它还将返回这些目录中的文件名。在第四个glob()中,我们通过了**/,它将只返回目录名。

元数据:关于数据的数据

在本节中,我们将了解pyPdf模块,它有助于从pdf文件中提取元数据。但首先,什么是元数据?元数据是关于数据的数据。元数据是描述主数据的结构化信息。元数据是该数据的摘要。它包含有关实际数据的基本信息。它有助于查找数据的特定实例。

Make sure you have the pdf file present in your directory from which you want to extract the information.

首先,我们必须安装pyPdf模块,如下所示:

pip install pyPdf

现在,我们将编写一个metadata_example.py脚本,看看如何从中获取元数据信息。我们将用 Python 2 编写此脚本:

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()

按如下方式运行脚本:

student@ubuntu:~$ python metadata_example.py ----Metadata of the file---- /Producer:Acrobat Distiller Command 3.0 for SunOS 4.1.3 and later (SPARC) /CreationDate:D:19980930143358

在前面的脚本中,我们使用了 Python2 的pyPdf模块。首先,我们创建了一个file_name变量,用于存储pdf的路径。使用PdfFileReader()读取数据。pdf_data变量将保存有关您的pdf的信息。最后,我们编写了一个 for 循环来获取元数据信息。

压缩与恢复

在本节中,我们将了解shutil模块的make_archive()功能,它将压缩整个目录。为此,我们将编写一个compress_a_directory.py脚本,并在其中编写以下内容:

import shutil shutil.make_archive('work', 'zip', 'work/')

按如下方式运行脚本:

$ python3 compress_a_directory.py

在前面的脚本中,在shutil.make_archive()函数中,我们将第一个参数作为名称传递给压缩文件。zip将是我们的压缩技术。work/将是我们要压缩的目录的名称。

现在,为了从压缩文件中恢复数据,我们将使用shutil模块中的unpack_archive()函数。创建一个unzip_a_directory.py脚本,并在其中写入以下内容:

import shutil shutil.unpack_archive('work1.zip')

按如下方式运行脚本:

$ python3 unzip_a_directory.py

现在,检查您的目录。解压目录后,您将获得所有内容。

使用 tarfile 模块创建 TAR 归档

本节将帮助您了解如何使用 Python 的tarfile模块创建 tar 归档。

tarfile模块用于使用gzipbz2压缩技术读写 tar 档案。确保存在必要的文件和目录。现在,创建一个tarfile_example.py脚本,并在其中写入以下内容:

import tarfile tar_file = tarfile.open("work.tar.gz", "w:gz") for name in ["welcome.py", "hello.py", "hello.txt", "sample.txt", "sample1.txt"]:
 tar_file.add(name) tar_file.close()

按如下方式运行脚本:

$ python3 tarfile_example.py

现在,检查您当前的工作目录;您将看到work.tar.gz已创建。

使用 tarfile 模块检查 TAR 文件的内容

在本节中,我们将了解如何在不提取 tar 文件的情况下检查已创建 tar 存档的内容。我们将使用 Python 的tarfile模块来完成。

创建一个examine_tar_file_content.py脚本,并在其中写入以下内容:

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

按如下方式运行脚本:

$ python3 examine_tar_file_content.py Output: ['welcome.py', 'hello.py', 'hello.txt', 'sample.txt', 'sample1.txt']

在前面的示例中,我们使用tarfile模块来检查创建的 tar 文件的内容。我们使用getnames()函数读取数据。

总结

在本章中,我们学习了处理文件和目录的 Python 脚本。我们还学习了如何使用os模块处理目录。我们学习了如何复制、移动、重命名和删除文件和目录。我们还了解了 Python 中用于比较和合并数据的 pandas 模块。我们学习了如何使用tarfile模块创建 tar 文件和读取 tar 文件的内容。在搜索文件和目录时,我们还进行了模式匹配。

在下一章中,我们将学习tar档案和 ZIP 创作。

问题

  1. 如何在不考虑不同操作系统(Windows、Llinux)的情况下处理不同的路径?
  2. 在 python 中,print()有哪些不同的参数可用?
  3. dir()关键字在 python 中有什么用途?
  4. 什么是pandas中的数据帧系列?
  5. 什么是列表理解?
  6. 我们能做集合理解和词典理解吗?如果是,怎么做?
  7. 如何使用数据框打印第一行/最后一行N
  8. 使用列表理解编写一个程序来打印奇数
  9. sys.argv的类型是什么?
  10. a) 设置
  11. b) 名单
  12. c) 元组
  13. d) 串

进一步阅读