系统管理员执行诸如处理各种文件、目录和数据等任务。在本章中,我们将学习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.csv
和student2.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.csv
和student2.csv
之间的数据。我们首先将数据帧(df1
、df2
转换为集合(s1
、s2
)。然后,我们使用了symmetric_difference()
套装。因此,它将检查s1
和s2
之间的对称差异,然后我们将打印结果。
我们将学习如何在 Python 中合并数据。为此,我们将使用 Python 的 pandas 库。为了合并数据,我们将使用上一节中已经创建的两个csv
文件student1.csv
和student2.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
现在,检查您的目录。解压目录后,您将获得所有内容。
本节将帮助您了解如何使用 Python 的tarfile
模块创建 tar 归档。
tarfile
模块用于使用gzip
、bz2
压缩技术读写 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
已创建。
在本节中,我们将了解如何在不提取 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 创作。
- 如何在不考虑不同操作系统(Windows、Llinux)的情况下处理不同的路径?
- 在 python 中,
print()
有哪些不同的参数可用? dir()
关键字在 python 中有什么用途?- 什么是
pandas
中的数据帧系列? - 什么是列表理解?
- 我们能做集合理解和词典理解吗?如果是,怎么做?
- 如何使用数据框打印第一行/最后一行
N
? - 使用列表理解编写一个程序来打印奇数
sys.argv
的类型是什么?- a) 设置
- b) 名单
- c) 元组
- d) 串