Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python脚本从文本文件创建文件夹目录_Python - Fatal编程技术网

使用python脚本从文本文件创建文件夹目录

使用python脚本从文本文件创建文件夹目录,python,Python,我有一个包含数百行的文本文件,每行包含一个数字,表示文件夹/文件应处于的级别和一个文件夹/文件名。因为层次结构太大,我想制作一个脚本来自动生成这个目录/子目录 示例文本文件 .0. Folder Name a .1. Folder Name b .2. Folder Name c .2. Folder Name c2 .1. Folder Name d .2. Folder Name e .2. Folder Name e2

我有一个包含数百行的文本文件,每行包含一个数字,表示文件夹/文件应处于的级别和一个文件夹/文件名。因为层次结构太大,我想制作一个脚本来自动生成这个目录/子目录

示例文本文件

 .0.  Folder Name a  
  .1. Folder Name b  
   .2. Folder Name c  
   .2. Folder Name c2  
  .1. Folder Name d  
   .2. Folder Name e  
   .2. Folder Name e2  
    .3. Folder Name f  
我假设我需要逐行阅读并使用os.mkdir,但我不知道如何降低目录级别

#path of file
import os

with open('Tree.txt', 'r') as t:
 for line in t:
  readline(.{Level}. {FolderName})
    if Level == '0'
     os.mkdir(FolderName)
    else if Level == '1'
     # go down and os.mkdir(FolderName)

要逐步删除和升级目录,您可以使用
os.chdir('example filepath')
os.chdir('..')
您可以使用
os.mkdir(path)
创建目录

您还可以使用以下正则表达式来解析字符串:

"\.(\d+)\. Folder Name ([a-zA-Z\d]+)"
然后可以使用递归创建目录树:

import os
import re

regex = r"\.([\d+])\. Folder Name ([a-zA-Z\d]+)"


def create_dir_tree(dir_list, current_level, current_path):
    for idx, line in enumerate(dir_list):
        matcher = re.match(regex, line)
        if not matcher:
            return
        level = int(matcher.group(1))
        dir_name = matcher.group(2)

        if level <= current_level:
            return
        if level != current_level + 1:
            continue

        new_path = os.path.join(current_path, dir_name)
        os.mkdir(new_path)

        create_dir_tree(dir_list[idx + 1:], level, new_path)


list = [".0. Folder Name a",
        ".1. Folder Name b",
        ".2. Folder Name c",
        ".2. Folder Name c2",
        ".1. Folder Name d",
        ".2. Folder Name e",
        ".2. Folder Name e2",
        ".3. Folder Name f"]

create_dir_tree(list, -1, os.path.expanduser("~/Desktop/untitled folder"))
导入操作系统
进口稀土
regex=r“\。([\d+])\.文件夹名([a-zA-Z\d]+)”
def创建目录树(目录列表、当前目录级别、当前路径):
对于idx,枚举(目录列表)中的行:
matcher=re.match(正则表达式,行)
如果不是匹配器:
回来
级别=整数(匹配器组(1))
dir_name=matcher.group(2)

如果水平我做了这样的事情。它使用的是受@JROS启发的
os.mkdir
os.chdir

它基本上是按级别检查的,如果级别更大,它就会进入文件夹。如果它较小,那么它只是向后移动n次,n是两个连续级别之间的差值

commands.txt
是包含行的文件

导入操作系统
将open('commands.txt')作为f:
line=f.readline().strip()
上一级=int(行分割(“.”[0]。分割(“.”[1])
文件夹名称=行分割(“文件夹名称”)[1]
当前水平=上一水平
while line:
如果当前级别>上一级别:
chdir(上一个文件夹名称)
elif当前级别<上一级别:
差异=上一级-当前级
对于范围内的i(差异):
os.chdir(“..”)
os.mkdir(文件夹名称)
line=f.readline().strip()
如果行:
上一级=当前级
当前级别=int(行分割(“.”[0]。分割(“.”[1])
上一个文件夹名称=文件夹名称
文件夹名称=行分割(“文件夹名称”)[1]

似乎您只想:
os.system(f'mkdir-p{FolderName}')
为了清晰起见,我不显示文件的读取,而是硬编码,所以假设您使用可变内容存储从文件读取的内容:

content = ''' .0.  Folder Name a  
  .1. Folder Name b  
   .2. Folder Name c  
   .2. Folder Name c2  
  .1. Folder Name d  
   .2. Folder Name e  
   .2. Folder Name e2  
    .3. Folder Name f  '''
你可以把它分成几行:

content = content.split('\n')
现在是行列表,但这些行的前面和结尾都有空格,我们需要删除这些空格:

content = [i.strip(' ') for i in content]
现在是将其标记化的时候了

def tokenize(x):
    n,name = x.split(' Folder Name ',1)
    return (int(n.replace('.','')),name)
content = [tokenize(i) for i in content]
现在
print(content)
给出
[(0,'a')、(1,'b')、(2,'c')、(2,'c2')、(1,'d')、(2,'e')、(2,'e2')、(3,'f')]
元组的
列表

最后,我们可以遍历树:

import os
paths = []
while(content):
    path = [content[0]]
    for i in content[1:]:
        if(i[0]<=path[-1][0]):
            break
        path.append(i)
    paths.append(os.path.join(*[i[1] for i in path]))
    content.remove(path[-1])

能否提供基于文本文件Welcome to StackOverflow创建的文件夹的树结构!你读过吗。你试过什么?请阅读,您不需要显式地“降低目录级别”,因为您传递到
os.mkdir
的路径包含该信息。如果文件夹
a
/home/a
,则
b
将是
/home/a/b
,并在所需级别创建。
for i in paths:
    if not os.path.exists(i):
        os.makedirs(i)