Résumé des dix opérations sur les fichiers les plus couramment utilisées en Python

coldplay.xixi
Libérer: 2020-12-28 17:45:07
avant
2738 Les gens l'ont consulté

Tutoriel PythonPrésente les dix principales opérations sur les fichiers courantes, pleines d'informations utiles~~

Résumé des dix opérations sur les fichiers les plus couramment utilisées en Python

Recommandé (gratuit) : Tutoriel Python (vidéo)

Il existe de nombreux besoins quotidiens en matière de traitement par lots de fichiers. L'écriture de scripts en Python peut être très pratique, mais dans ce processus, vous devrez inévitablement traiter des documents. Pour la première fois, il y aura beaucoup de documents avec lesquels vous n'aurez aucun moyen de commencer, vous ne pourrez donc vous rendre qu'à Du Niang.

Dans cet article, Dongge a trié les 10 opérations sur les fichiers les plus couramment utilisées en Python, qui sont utilisées à la fois dans le traitement par lots et dans la lecture de fichiers. Je pense que cette revue sera utile.

1. Afficher le répertoire actuel

Quand on veut savoir quel est le répertoire de travail actuel, on peut simplement utiliser la fonction os du getcwd() module , ou utilisez pathlib de cwd() comme indiqué ci-dessous.

>>> # 第一种方法:显示当前目录
... 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
Copier après la connexion
Si vous utilisez une ancienne version de Python (

2. Créer un nouveau répertoire

Pour créer un répertoire, vous pouvez utiliser la fonction os du module mkdir(). Cette fonction créera un répertoire sous le chemin spécifié, si seul le nom du répertoire est utilisé, un dossier sera créé dans le répertoire courant, c'est-à-dire le concept de chemins absolus et de chemins relatifs.

>>> # 在当前文件夹创建新目录
... 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
Copier après la connexion

Cependant, si vous souhaitez créer un répertoire à plusieurs niveaux, comme un dossier sous un dossier), vous devez utiliser cette makedirs() fonction.

>>> # 创建包含子目录的目录
... os.makedirs('tmp_level0/tmp_level1')
... print("目录是否存在:", os.path.exists("tmp_level0/tmp_level1"))
... 
Is the directory there: True
Copier après la connexion

Si vous utilisez la dernière version de Python (≥3.4), vous pouvez envisager d'utiliser le module pathlib pour créer un nouveau répertoire. Non seulement il peut créer des sous-répertoires, mais il peut également gérer les répertoires manquants dans le chemin.

# 使用 pathlib
from pathlib import Path
Path("test_folder").mkdir(parents=True, exist_ok=True)
Copier après la connexion

Un problème à noter est que si vous essayez d'exécuter plusieurs fois certains des codes ci-dessus, vous risquez de rencontrer le problème "Impossible de créer un nouveau répertoire qui existe déjà." Nous pouvons gérer cela en définissant le paramètre exist_ok sur True (la valeur False par défaut nous empêchera de créer le répertoire).

>>> # 使用 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'
Copier après la connexion

3. Supprimer les répertoires et les fichiers

Une fois que nous avons fini de travailler sur certains fichiers ou dossiers, nous souhaiterons peut-être les supprimer. Pour ce faire, nous pouvons utiliser la fonction os du module remove() pour supprimer des fichiers. Si nous voulons supprimer un dossier, nous devrions utiliser rmdir() à la place.

>>> # 删除一个文件
... 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
Copier après la connexion

Si vous utilisez le module pathlib, vous pouvez utiliser la méthode unlink(), et pour supprimer un répertoire, vous pouvez utiliser la méthode rmdir(). Notez que les deux méthodes sont des méthodes d’instance de l’objet Path.

4. Obtenir la liste des fichiers

Lorsque nous analysons un certain travail ou un projet d'apprentissage automatique pour le traitement des données, nous devons obtenir la liste des fichiers dans un répertoire spécifique.

Habituellement, les noms de fichiers ont des modèles correspondants. Supposons que nous voulions trouver tous les fichiers .txt dans le répertoire, nous pouvons utiliser la méthode glob() de l'objet Path pour y parvenir. La méthode glob() crée un générateur qui nous permet d'itérer.

>>> txt_files = list(Path('.').glob("*.txt"))
... print("Txt files:", txt_files)
... 
Txt files: [PosixPath('hello_world.txt'), PosixPath('hello.txt')]
Copier après la connexion

Alternativement, il est également pratique d'utiliser glob模块 directement, comme indiqué ci-dessous, qui a des fonctionnalités similaires en créant une liste de noms de fichiers pouvant être utilisés. Dans la plupart des cas, comme pour la lecture et l'écriture de fichiers, les deux peuvent être utilisés.

>>> from glob import glob
... files = list(glob('h*'))
... print("以h开头的文件:", files)
... 
Files starting with h: ['hello_world.txt', 'hello.txt']
Copier après la connexion

5. Déplacer et copier des fichiers

Déplacer des fichiers

L'une des tâches courantes de gestion de fichiers consiste à déplacer et à copier fichiers . En Python, ces tâches peuvent être effectuées très facilement. Pour déplacer un fichier, renommez simplement le fichier en remplaçant son ancien répertoire par le répertoire cible. Supposons que nous devions déplacer tous les fichiers .txt vers un autre dossier, utilisez Path pour y parvenir ci-dessous.

>>> 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
Copier après la connexion

Copie de fichiers

Nous pouvons utiliser les fonctions disponibles dans le module _shutil_, le module _shutil_ est un autre module utile dans la bibliothèque standard pour les opérations sur les fichiers. Nous pouvons copy() utiliser cette fonction dans un module en spécifiant les fichiers source et destination sous forme de chaînes. Un exemple simple est présenté ci-dessous. Bien sûr, vous pouvez combiner la fonction copy() avec la fonction glob() pour traiter un tas de fichiers avec le même modèle.

>>> 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
Copier après la connexion

6. Vérifier le répertoire/fichier

La méthode exists() a été utilisée dans l'exemple ci-dessus pour vérifier si un chemin spécifique existe. S'il existe, il renvoie True ; s'il n'existe pas, il renvoie False. Cette fonction est disponible dans les modules os et pathlib, et leur utilisation respective est la suivante.

# os 模块中 exists() 用法
os.path.exists('path_to_check')

# pathlib 模块中 exists() 用法
Path('directory_path').exists()
Copier après la connexion

En utilisant pathlib nous pouvons également vérifier si le chemin est un répertoire ou un fichier.

# 检查路径是否是目录
os.path.isdir('需要检查的路径')
Path('需要检查的路径').is_dir()

# 检查路径是否是文件
os.path.isfile('需要检查的路径')
Path('需要检查的路径').is_file()
Copier après la connexion

7. Obtenir des informations sur le fichier

Nom du fichier

Lors du traitement des fichiers, dans de nombreux cas, il est nécessaire d'extraire le nom du fichier. Utiliser Path est très simple, vous pouvez afficher l'attribut name path.name sur l'objet Path. Si vous ne souhaitez pas ajouter de suffixe, vous pouvez vérifier l'attribut 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
Copier après la connexion

Suffixe du fichier

如果想单独提取文件的后缀,可查看Path对象的suffix属性。

>>> file_path = Path('closures.py')
... print("文件后缀:", file_path.suffix)
... 
File Extension: .py
Copier après la connexion

文件更多信息

如果要获取有关文件的更多信息,例如文件大小和修改时间,则可以使用该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.3204417
Copier après la connexion

8. 读取文件

最重要的文件操作之一就是从文件中读取数据。读取文件,最常规的方法是使用内置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!
Copier après la connexion

如果文件中没有太多数据,则可以使用该read()方法一次读取所有内容。但如果文件很大,则应考虑使用生成器,生成器可以逐行处理数据。

默认将文件内容视为文本。如果要使用二进制文件,则应明确指定用r还是rb

另一个棘手的问题是文件的编码。在正常情况下,open()处理编码使用utf-8编码,如果要使用其他编码处理文件,应设置encoding参数。

9. 写入文件

仍然使用open()函数,将模式改为wa打开文件来创建文件对象。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
Copier après la connexion

上面每次打开文件时都使用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 到压缩文件
Copier après la connexion

解压缩文件

>>> # 解压缩文件
... 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
Copier après la connexion

结论

以上就是整理的Python常用文件操作,全部使用内置函数实现。当然,也可以借助比如pandas等库来完成一些操作。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal