使用Python处理文件

我们大多数人都曾经历过这样的经历,即我们的机器中有大量混乱的文件。 它发生了。 一分钟,您打开一个大型zip文件,接下来您知道的是,文件在目录中无处不在,与所有重要文件混合在一起,然后随机放置,从而使您需要手动对需要存放的内容进行分类。 真是痛苦。 为了简化此过程,我们将以智能方式深入研究python的文件管理。

聪明地工作,而不是刻苦。

让我们开始。 我们将使用python 3.4或更高版本。

假设您已经安装并运行了python,我们将逐步介绍OS模块以及我们将介绍的其他一些模块。 其中大多数都是python附带的,因此无需安装其他任何东西。

创建随机文件

创建一个要使用的目录。 称之为ManageFiles 。 在此文件夹中,创建另一个文件夹RandomFiles 。 您的目录结构现在应如下所示:

ManageFiles/
 |
 |_RandomFiles/

我们将在RandomFiles目录中创建要播放的随机文件

ManageFiles目录中创建一个文件create_random_files.py 。 您现在有这个:

ManageFiles/
 |
 |_ create_random_files.py
 |_RandomFiles/

做完了吗 现在获取以下代码,我们稍后将详细介绍它。

import os
from pathlib import Path
import random


list_of_extensions = [ '.rst' , '.txt' , '.md' , '.docx' , '.odt' , '.html' , '.ppt' , '.doc' ]


# get into the RandomFiles directory
os.chdir( './RandomFiles' )

for item in list_of_extensions:
    # create 20 random files for each file extension
    for num in range( 20 ):
        # let the file begin with a random number between 1 to 50
        file_name = random.randint( 1 , 50 )
        file_to_create = str(file_name) + item
        Path(file_to_create).touch()

从python 3.4开始,我们有了pathlib (我们的小魔术盒)。 我们还导入python的random函数以创建随机数; 坚持这个想法,当我们到达使用它的行时,我们将进行覆盖。

首先,我们创建一个文件扩展名列表,从中可以获取随机文件。 随时添加。

接下来,我们切换到RandomFiles目录,然后进入循环,因此开始。

我们只是说,把这个list_of_extensions每个项目都做一遍,并对其进行以下操作。 让我们以.txt为例。 我们进入另一个循环,在该.txt ,我们对其进行了20次处理。

还记得我们的random进口吗? 我们使用它为文件选择1到50之间的随机数。 简而言之,这个小循环的目的是为我们节省时间,减少创造性的工作量(不用担心,我是这个工作人员的一部分),可以为随机文件命名。 我们将创建一个23.txt14.txt的文件,只要它在我们的50范围内(二十次)即可。 这只是为了创建一个足够大的烂摊子,以至于在手动移动时会感到疼痛。 其他扩展将执行相同的过程。 下一个? 在您的终端中运行它。

python create_random_files.py

恭喜你! 现在,我们的目录混乱了。 现在清理它。

在我们的create_random_files.py所在的位置,创建一个文件clean_up.py并获取以下内容。

方法1:

import os
import shutil
import glob

# get into the RandomFiles directory
os.chdir( './RandomFiles' )

# get the list of files in the directory RandomFiles
files_to_group = []
for random_file in os.listdir( '.' ):
    files_to_group.append(random_file)


# get all the file extensions present
file_extensions = []
for our_file in files_to_group:
    file_extensions.append(os.path.splitext(our_file)[ 1 ])

print(set(file_extensions))


file_types = set(file_extensions)


for type in file_types:
    new_directory = type.replace( "." , " " )
    os.mkdir(new_directory)  # create directory with given name

    for fname in glob.glob( f'*. {type[ 1 :]} ' ):
        shutil.move(fname, new_directory)

为此,我们导入了两个新库。 shutilglob 。 该shutil将帮助我们把我们的文件,而glob会帮助找到分类的文件。 就像以前一样,当我们到达生产线时,一切都会变得清楚。

首先,我们获得目录中所有文件的列表。

在这里,我们假设我们不知道目录中有哪些文件。 这意味着不同于您可以手动获取所有扩展名并使用`if statement`或`switch`的地方,我们希望程序浏览目录并为我们执行此操作。 如果文件具有数十个扩展名或日志文件,该怎么办? 您会手动执行此操作吗?

一旦获得了文件夹中所有文件的列表,便进入另一个循环,以获取这些文件的文件扩展名。

注意我们如何使用:

os.path.splitext(our_file)[1 ]

当前,our_file变量看起来类似于以下5.docx 。 当我们分割它时,我们得到:

`('5' , '.docx' )`

然后我们从中获得索引[1],由于5是索引[0],因此它又需要.docx

因此,我们现在有了该文件夹中存在的所有文件扩展名的列表,无论是否重复。

为了使其不重复,我们进行设置。 这将从列表中获取所有项目,并且仅获取唯一项目。 在我们的情况下,如果我们有一个列表,其中有扩展名,则说.docx在集合中重复一遍又一遍将确保我们只有一个。

# create a set and assign it to a variable 
file_types = set(file_extensions)

请记住,我们的文件类型列表中仍然包含. 对于每个文件扩展名。 这意味着如果我们要以完全相同的方式创建一个文件夹,我们最终将创建隐藏的文件夹,那是我们不想要的。

因此,当我们遍历此集合时,我们将创建一个具有相同扩展名的目录,仅这次,我们替换了. 名称中带有一个空字符串。

new_directory = type.replace("." , " " )
# our directory would now be called  'docx'

我们仍然需要.docx扩展名来移动文件。

for fname in glob.glob( f'*. {type[ 1 :]} ' )

这仅意味着获取以.docx文件扩展名结尾的任何文件(请注意f'*.{type[1:]}'使用的间距)。 没有空间

通配符*表示文件可以以任何名称命名,只要文件以.docx结尾即可。 由于我们已经放置了期间. 我们使用我们拥有的字符串,然后再获取其他所有字符串,这就是为什么我们使用[1:]的原因,它仅表示从第一个字符之后获取,因此采用docx

接下来是什么? 将具有此扩展名的任何文件移动到名为so的目录中。

shutil.move(fname, new_directory)

这样,一旦为循环中找到的第一个文件创建了目录,就无法再创建其他副本了。 简而言之,我们将没有用于存储5.docx的文件夹,也没有许多用于存储34.docx的文件夹,依此类推。 建立目录后,所有其他类似的文件夹将移至该目录。 而已!

方法二

您也可以使用生成器。 这是用一个衬纸创建列表的一种奇特方法。

import os
import shutil
import glob

# get into the RandomFiles directory
os.chdir( './RandomFiles' )

#take every file from the directory and add to a list for all files
all_files = [x for x in os.listdir( '.' ) ]

# make a set for the extensions present in the directory
file_types = set((os.path.splitext(f)[ 1 ] for f in all_files))

for ftype in file_types:
    new_directory = ftype.replace( "." , '' )
    os.mkdir(new_directory)

    for fname in glob.glob( f'*. {ftype[ 1 :]} ' ):
        shutil.move(fname, new_directory)

这两个都将起作用。 现在,您已经按照扩展名对所有文件进行了排序。

ManageFiles/
 |
 |_create_random_files.py
 |_RandomFiles/
    |_doc
    |_docx
    |_html
    |_md
    |_odt
    |_ppt

哇! 好多 我们确实节省了一些时间。 任何问题? 随时与我们联系。 就是这样,下周我们将其保留一个档次。 有关此代码,请检查TheGreenCode

一如既往: @codes_green

先前发布在 https://thegreencodes.com/file-management-with-python-ck02cpxu30010fqs1stv451gx

翻译自: https://hackernoon.com/working-with-files-in-python-ik1f3ur7

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值