Heim >Backend-Entwicklung >Python-Tutorial >Zusammenfassung der zehn am häufigsten verwendeten Dateioperationen in Python
Python-TutorialStellt die zehn häufigsten Dateivorgänge vor, voller nützlicher Informationen~~
Empfohlen (kostenlos): Python-Tutorial (Video)
Der tägliche Bedarf an Stapelverarbeitung Die Anzahl der Dateien ist sehr hoch. Das Schreiben von Skripten in Python kann sehr praktisch sein, aber Sie müssen sich dabei zwangsläufig mit Dateien befassen. Zum ersten Mal gibt es viele Dateioperationen, die Sie nicht starten können kann nur Du Niang finden.
In diesem Artikel hat Bruder Dong die 10 am häufigsten verwendeten Dateioperationen in Python zusammengestellt, die sowohl bei der Stapelverarbeitung als auch beim Lesen von Dateien verwendet werden.
1. Zeigt das aktuelle Verzeichnis an
Wenn wir wissen möchten, was das aktuelle Arbeitsverzeichnis ist, können wir einfach die Funktion getcwd()
des os
verwenden module oder verwenden Sie pathlib
s cwd()
wie unten gezeigt. os
模块的getcwd()
功能,或者使用pathlib
的cwd()
,如下所示。
>>> # 第一种方法:显示当前目录 ... import os ... print("当前工作目录:", os.getcwd()) ... Current Work Directory: /Users/ycui1/PycharmProjects/Medium_Python_Tutorials >>> # 第二种方法:或者我们也可以使用 pathlib ... from pathlib import Path ... print("当前工作目录:", Path.cwd()) ... Current Work Directory: /Users/ycui1/PycharmProjects/Medium_Python_Tutorials
如果使用的是旧版本的Python(<3.4),则必须使用该os模块。
2. 建立一个新目录
要创建目录,可以使用os
模块的mkdir()
功能。该函数将在指定的路径下创建目录,如果仅使用目录名称,则将在当前目录中创建文件夹,即绝对路径和相对路径的概念。
>>> # 在当前文件夹创建新目录 ... os.mkdir("test_folder") ... print("目录是否存在:", os.path.exists("test_folder")) ... 目录是否存在: True >>> # 在特定文件夹创建新目录 ... os.mkdir('/Users/ycui1/PycharmProjects/tmp_folder') ... print("目录是否存在:", os.path.exists('/Users/ycui1/PycharmProjects/tmp_folder')) ... 目录是否存在: True<p>但是,如果想要建立一个多层级的目录,比如文件夹中下的文件夹),则需要使用该<code>makedirs()</code>功能。</p> <pre class="brush:php;toolbar:false">>>> # 创建包含子目录的目录 ... os.makedirs('tmp_level0/tmp_level1') ... print("目录是否存在:", os.path.exists("tmp_level0/tmp_level1")) ... Is the directory there: True
如果使用最新版本的Python(≥3.4),则可以考虑利用pathlib
模块创建新目录。它不仅可以创建子目录,而且可以处理路径中所有丢失的目录。
# 使用 pathlib from pathlib import Path Path("test_folder").mkdir(parents=True, exist_ok=True)
需要注意一个问题,如果尝试多次运行上述某些代码,可能会遇到问题“无法创建已经存在的新目录”。我们可以将exist_ok
参设置为True
来处理此问题(默认值False值将阻止我们创建目录)。
>>> # 使用 pathlib ... from pathlib import Path ... Path("test_folder").mkdir(parents=True, exist_ok=False) ... Traceback (most recent call last): File "<input>", line 3, in <module> File "/Users/ycui1/.conda/envs/Medium/lib/python3.8/pathlib.py", line 1284, in mkdir self._accessor.mkdir(self, mode) FileExistsError: [Errno 17] File exists: 'test_folder'
3. 删除目录和文件
完成对某些文件或文件夹的操作后,我们可能希望删除它。为此,我们可以使用os
模块中的remove()
函数来删除文件。如果要删除文件夹,我们应该改用rmdir()
。
>>> # 删除一个文件 ... print(f"* 删除文件前 {os.path.isfile('tmp.txt')}") ... os.remove('tmp.txt') ... print(f"* 删除文件后 {os.path.exists('tmp.txt')}") ... * 删除文件前 True * 删除文件后 False >>> # 删除一个文件夹 ... print(f"* 删除文件夹前 {os.path.isdir('tmp_folder')}") ... os.rmdir('tmp_folder') ... print(f"* 删除文件夹后 {os.path.exists('tmp_folder')}") ... * 删除文件夹前 True * 删除文件夹后 False
如果使用pathlib
模块,可以使用unlink()
方法,而删除目录可以使用rmdir()
方法。请注意,这两种方法都是Path对象的实例方法。
4. 获取文件列表
当我们分析某个工作或机器学习项目进行数据处理时,需要获取特定目录中的文件列表。
通常,文件名具有匹配的模式。假设我们要查找目录中的所有.txt文件,可使用Path对象的方法glob()
来实现。glob()
方法创建了一个生成器,允许我们进行迭代。
>>> txt_files = list(Path('.').glob("*.txt")) ... print("Txt files:", txt_files) ... Txt files: [PosixPath('hello_world.txt'), PosixPath('hello.txt')]
另外,直接使用glob模块
也很方便,如下所示,通过创建可以使用的文件名列表,它具有相似的功能。在大多数情况下,例如文件读取和写入,两者都可以使用。
>>> from glob import glob ... files = list(glob('h*')) ... print("以h开头的文件:", files) ... Files starting with h: ['hello_world.txt', 'hello.txt']
5. 移动和复制文件
移动文件
常规文件管理任务之一是移动和复制文件。在Python中,这些工作可以非常轻松地完成。要移动文件,只需将其旧目录替换为目标目录即可重命名该文件。假设我们需要将所有.txt文件移动到另一个文件夹,下面用Path
来实现。
>>> target_folder = Path("目标文件") ... target_folder.mkdir(parents=True,exist_ok=True) ... source_folder = Path('.') ... ... txt_files = source_folder.glob('*.txt') ... for txt_file in txt_files: ... filename = txt_file.name ... target_path = target_folder.joinpath(filename) ... print(f"** 移动文件 {filename}") ... print("目标文件存在:", target_path.exists()) ... txt_file.rename(target_path) ... print("目标文件存在:", target_path.exists(), '\n') ... ** 移动文件 hello_world.txt 目标文件存在: False 目标文件存在: True ** 移动文件 hello.txt 目标文件存在: False 目标文件存在: True
复制文件
我们可以利用_shutil_
模块中可用的功能,_shutil_模块是标准库中另一个用于文件操作的有用模块。我们可以copy()
通过将源文件和目标文件指定为字符串来在模块中使用该函数。一个简单的例子如下所示。当然,您可以将copy()
函数与glob()
函数结合使用,以处理具有相同模式的一堆文件。
>>> import shutil ... ... source_file = "target_folder/hello.txt" ... target_file = "hello2.txt" ... target_file_path = Path(target_file) ... print("* 复制前,文件存在:", target_file_path.exists()) ... shutil.copy(source_file, target_file) ... print("* 复制后,文件存在:", target_file_path.exists()) ... * 复制前,文件存在: False * 复制后,文件存在: True
6. 检查目录/文件
上面的示例中一直在使用exists()
方法来检查是否存在特定路径。如果存在,返回True;如果不存在,则返回False。此功能在os
和pathlib
模块中均可用,各自的用法如下。
# os 模块中 exists() 用法 os.path.exists('path_to_check') # pathlib 模块中 exists() 用法 Path('directory_path').exists()
使用pathlib
,我们还可以检查路径是目录还是文件。
# 检查路径是否是目录 os.path.isdir('需要检查的路径') Path('需要检查的路径').is_dir() # 检查路径是否是文件 os.path.isfile('需要检查的路径') Path('需要检查的路径').is_file()
7. 获取文件信息
文件名称
处理文件时,许多情况下都需要提取文件名。使用Path非常简单,可以在Path对象上查看name属性path.name
。如果不想带后缀,可以查看stem属性path.stem
for py_file in Path().glob('c*.py'): ... print('Name with extension:', py_file.name) ... print('Name only:', py_file.stem) ... 带文件后缀: closures.py 只有文件名: closures 带文件后缀: counter.py 只有文件名: counter 带文件后缀: context_management.py 只有文件名: context_management
Wenn Sie eine ältere Version von Python (2. Erstellen Sie ein neues Verzeichnis
Um ein Verzeichnis zu erstellen, können Sie die Funktionmkdir()
des Modulsos
verwenden. Diese Funktion erstellt ein Verzeichnis unter dem angegebenen Pfad. Wenn nur der Verzeichnisname verwendet wird, wird ein Ordner im aktuellen Verzeichnis erstellt, dh das Konzept von absoluten Pfaden und relativen Pfaden. 🎜>>> file_path = Path('closures.py') ... print("文件后缀:", file_path.suffix) ... File Extension: .py🎜Wenn Sie jedoch ein mehrstufiges Verzeichnis erstellen möchten, z. B. einen Ordner unter einem Ordner, müssen Sie die Funktionmakedirs()
verwenden. 🎜>>> # 路径 path 对象 ... current_file_path = Path('iterable_usages.py') ... file_stat = current_file_path.stat() ... >>> # 获取文件大小: ... print("文件大小(Bytes):", file_stat.st_size) 文件大小(Bytes): 3531 >>> # 获取最近访问时间 ... print("最近访问时间:", file_stat.st_atime) 最近访问时间: 1595435202.310935 >>> # 获取最近修改时间 ... print("最近修改时间:", file_stat.st_mtime) 最近修改时间: 1594127561.3204417🎜Wenn Sie die neueste Version von Python (≥3.4) verwenden, können Sie das Modulpathlib
nutzen, um ein neues Verzeichnis zu erstellen. Es kann nicht nur Unterverzeichnisse erstellen, sondern auch alle fehlenden Verzeichnisse im Pfad verarbeiten. 🎜>>> # 读取所有的文本 ... with open("hello2.txt", 'r') as file: ... print(file.read()) ... Hello World! Hello Python! >>> # 逐行的读取 ... with open("hello2.txt", 'r') as file: ... for i, line in enumerate(file, 1): ... print(f"* 读取行 #{i}: {line}") ... * 读取行 #1: Hello World! * 读取行 #2: Hello Python!🎜Ein zu beachtendes Problem ist, dass, wenn Sie versuchen, einige der oben genannten Codes mehrmals auszuführen, möglicherweise das Problem „Es kann kein neues Verzeichnis erstellt werden, das bereits existiert“ auftritt. Wir können damit umgehen, indem wir den Parameterexist_ok
aufTrue
setzen (der Standardwert False verhindert, dass wir das Verzeichnis erstellen). 🎜>>> # 向文件中写入新数据 ... with open("hello3.txt", 'w') as file: ... text_to_write = "Hello Files From Writing" ... file.write(text_to_write) ... >>> # 增加一些数据 ... with open("hello3.txt", 'a') as file: ... text_to_write = "\nHello Files From Appending" ... file.write(text_to_write) ... >>> # 检查文件数据是否正确 ... with open("hello3.txt") as file: ... print(file.read()) ... Hello Files From Writing Hello Files From Appending🎜🎜3. Verzeichnisse und Dateien löschen🎜🎜🎜Nachdem wir mit der Arbeit an einigen Dateien oder Ordnern fertig sind, möchten wir sie möglicherweise löschen. Dazu können wir die Funktionremove()
im Modulos
verwenden, um die Datei zu löschen. Wenn wir einen Ordner löschen möchten, sollten wir stattdessenrmdir()
verwenden. 🎜>>> from zipfile import ZipFile ... ... # 创建压缩文件 ... with ZipFile('text_files.zip', 'w') as file: ... for txt_file in Path().glob('*.txt'): ... print(f"*添加文件: {txt_file.name} 到压缩文件") ... file.write(txt_file) ... *添加文件: hello3.txt 到压缩文件 *添加文件: hello2.txt 到压缩文件🎜Wenn Sie das Modulpathlib
verwenden, können Sie die Methodeunlink()
verwenden, und zum Löschen eines Verzeichnisses können Sie die Methodermdir()-Methode. Beachten Sie, dass beide Methoden Instanzmethoden des Path-Objekts sind. 🎜🎜🎜4. Holen Sie sich die Dateiliste🎜🎜🎜Wenn wir einen bestimmten Job oder ein maschinelles Lernprojekt für die Datenverarbeitung analysieren, müssen wir die Dateiliste in einem bestimmten Verzeichnis abrufen. 🎜🎜Normalerweise haben Dateinamen übereinstimmende Muster. Angenommen, wir möchten alle TXT-Dateien im Verzeichnis finden. Dazu können wir die Methode <code>glob()
des Path-Objekts verwenden. Die Methodeglob()
erstellt einen Generator, der es uns ermöglicht, zu iterieren. 🎜>>> # 解压缩文件 ... with ZipFile('text_files.zip') as zip_file: ... zip_file.printdir() ... zip_file.extractall() ... File Name Modified Size hello3.txt 2020-07-30 20:29:50 51 hello2.txt 2020-07-30 18:29:52 26🎜 Alternativ ist es auch bequem, dasglob-Modul
direkt zu verwenden, wie unten gezeigt, das über eine ähnliche Funktionalität verfügt, indem es eine Liste verwendbarer Dateinamen erstellt. In den meisten Fällen, beispielsweise beim Lesen und Schreiben von Dateien, können beide verwendet werden. 🎜rrreee🎜🎜5. Dateien verschieben und kopieren 🎜🎜🎜🎜Dateien verschieben🎜🎜🎜Eine der regelmäßigen Dateiverwaltungsaufgaben ist das Verschieben und Kopieren von Dateien. In Python können diese Aufgaben sehr einfach erledigt werden. Um eine Datei zu verschieben, benennen Sie die Datei einfach um, indem Sie ihr altes Verzeichnis durch das Zielverzeichnis ersetzen. Angenommen, wir müssen alle TXT-Dateien in einen anderen Ordner verschieben. Verwenden Sie dazuPfad
. 🎜rrreee🎜🎜Dateien kopieren🎜🎜🎜Wir können die im Modul_shutil_
verfügbaren Funktionen nutzen, einem weiteren nützlichen Modul in der Standardbibliothek für Dateioperationen. Wir können diese Funktion in einem Modul verwenden, indem wir die Quell- und Zieldateien als Zeichenfolgen angeben. Ein einfaches Beispiel ist unten dargestellt. Natürlich können Sie die Funktioncopy()
in Verbindung mit der Funktionglob()
verwenden, um eine Reihe von Dateien mit demselben Muster zu verarbeiten. 🎜rrreee🎜🎜6. Verzeichnis/Datei prüfen 🎜🎜🎜Im obigen Beispiel wurde die Methodeexists()
verwendet, um zu überprüfen, ob ein bestimmter Pfad vorhanden ist. Wenn es existiert, wird „True“ zurückgegeben; wenn es nicht existiert, wird „False“ zurückgegeben. Diese Funktion ist sowohl in den Modulenos
als auchpathlib
verfügbar und wird wie folgt verwendet. 🎜rrreee🎜Mitpathlib
können wir auch prüfen, ob der Pfad ein Verzeichnis oder eine Datei ist. 🎜rrreee🎜🎜7. Dateiinformationen abrufen🎜🎜🎜🎜Dateiname🎜🎜🎜Bei der Verarbeitung von Dateien ist es in vielen Fällen erforderlich, den Dateinamen zu extrahieren. Die Verwendung von Path ist sehr einfach. Sie können das Namensattributpath.name
für das Path-Objekt anzeigen. Wenn Sie kein Suffix hinzufügen möchten, können Sie das Stammattributpath.stem
anzeigen. 🎜rrreee🎜🎜Dateisuffix🎜🎜如果想单独提取文件的后缀,可查看Path对象的
suffix
属性。>>> file_path = Path('closures.py') ... print("文件后缀:", file_path.suffix) ... File Extension: .py文件更多信息
如果要获取有关文件的更多信息,例如文件大小和修改时间,则可以使用该
stat()
方法,该方法和os.stat()
一样。>>> # 路径 path 对象 ... current_file_path = Path('iterable_usages.py') ... file_stat = current_file_path.stat() ... >>> # 获取文件大小: ... print("文件大小(Bytes):", file_stat.st_size) 文件大小(Bytes): 3531 >>> # 获取最近访问时间 ... print("最近访问时间:", file_stat.st_atime) 最近访问时间: 1595435202.310935 >>> # 获取最近修改时间 ... print("最近修改时间:", file_stat.st_mtime) 最近修改时间: 1594127561.32044178. 读取文件
最重要的文件操作之一就是从文件中读取数据。读取文件,最常规的方法是使用内置
open()
函数创建文件对象。默认情况下,该函数将以读取模式打开文件,并将文件中的数据视为文本。>>> # 读取所有的文本 ... with open("hello2.txt", 'r') as file: ... print(file.read()) ... Hello World! Hello Python! >>> # 逐行的读取 ... with open("hello2.txt", 'r') as file: ... for i, line in enumerate(file, 1): ... print(f"* 读取行 #{i}: {line}") ... * 读取行 #1: Hello World! * 读取行 #2: Hello Python!如果文件中没有太多数据,则可以使用该
read()
方法一次读取所有内容。但如果文件很大,则应考虑使用生成器,生成器可以逐行处理数据。默认将文件内容视为文本。如果要使用二进制文件,则应明确指定用
r
还是rb
。另一个棘手的问题是文件的编码。在正常情况下,
open()
处理编码使用utf-8
编码,如果要使用其他编码处理文件,应设置encoding
参数。9. 写入文件
仍然使用
open()
函数,将模式改为w
或a
打开文件来创建文件对象。w
模式下会覆盖旧数据写入新数据,a
模式下可在原有数据基础上增加新数据。>>> # 向文件中写入新数据 ... with open("hello3.txt", 'w') as file: ... text_to_write = "Hello Files From Writing" ... file.write(text_to_write) ... >>> # 增加一些数据 ... with open("hello3.txt", 'a') as file: ... text_to_write = "\nHello Files From Appending" ... file.write(text_to_write) ... >>> # 检查文件数据是否正确 ... with open("hello3.txt") as file: ... print(file.read()) ... Hello Files From Writing Hello Files From Appending上面每次打开文件时都使用
with
语句。
with
语句为我们创建了一个处理文件的上下文,当我们完成文件操作后,它可以关闭文件对象。这点很重要,如果我们不及时关闭打开的文件对象,它很有可能会被损坏。10. 压缩和解压缩文件
压缩文件
zipfile
模块提供了文件压缩的功能。使用ZipFile()
函数创建一个zip
文件对象,类似于我们对open()函数所做的操作,两者都涉及创建由上下文管理器管理的文件对象。>>> from zipfile import ZipFile ... ... # 创建压缩文件 ... with ZipFile('text_files.zip', 'w') as file: ... for txt_file in Path().glob('*.txt'): ... print(f"*添加文件: {txt_file.name} 到压缩文件") ... file.write(txt_file) ... *添加文件: hello3.txt 到压缩文件 *添加文件: hello2.txt 到压缩文件解压缩文件
>>> # 解压缩文件 ... with ZipFile('text_files.zip') as zip_file: ... zip_file.printdir() ... zip_file.extractall() ... File Name Modified Size hello3.txt 2020-07-30 20:29:50 51 hello2.txt 2020-07-30 18:29:52 26结论
以上就是整理的Python常用文件操作,全部使用内置函数实现。当然,也可以借助比如
pandas
等库来完成一些操作。
Das obige ist der detaillierte Inhalt vonZusammenfassung der zehn am häufigsten verwendeten Dateioperationen in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!