我们大多数人都曾经历过这样的经历,即我们的机器中有大量混乱的文件。 它发生了。 一分钟,您打开一个大型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.txt
或14.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)
为此,我们导入了两个新库。 shutil
和glob
。 该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