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

时间:2019-05-27 05:34:33

标签: python

我有一个包含数百行的文本文件,每行包含一个数字,代表文件夹/文件应位于的级别以及文件夹/文件名。因为层次结构太大,所以我想制作一个脚本来自动创建此目录/子目录。

示例文本文件

componentDidMount(){
        this.checkIfLoggedIn();
    }

    checkIfLoggedIn = () => {
        firebase.auth().onAuthStateChanged(
            function(user){
                if(user){
                    if(user === firebase.auth().currentUser.uid) {
                        this.props.navigation.navigate('welcomeBuyer'); 
                    }
                    else{
                        this.props.navigation.navigate('welcomeVendor');
                    }
                }
                else{
                    this.props.navigation.navigate('Main');
                };
            }.bind(this)
        );
    };

我假设我需要逐行阅读并使用os.mkdir,但是我不知道如何降低目录级别。

 .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  

5 个答案:

答案 0 :(得分:1)

您可以使用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"))

现在只需要将文件读取到列表中即可

答案 1 :(得分:0)

要下移和上移目录,可以使用os.chdir('example filepath')os.chdir('..')

答案 2 :(得分:0)

我做了这样的事情。它使用的是受{JROS启发的os.mkdiros.chdir

它基本上按级别检查,如果级别更大,它将进入文件夹。如果小于此值,则它将简单地向后移动n次,n为两个连续级别之间的差。

commands.txt是包含各行的文件。

import os

with open('commands.txt') as f:
  line = f.readline().strip()
  prev_level = int(line.split(". ")[0].split(".")[1])
  folder_name = line.split("Folder Name ")[1]
  curr_level = prev_level
  while line:
    if curr_level > prev_level:
      os.chdir(prev_folder_name)
    elif curr_level < prev_level:
      diff = prev_level - curr_level
      for i in range(diff):
        os.chdir('..')

    os.mkdir(folder_name)

    line = f.readline().strip()
    if line:
      prev_level = curr_level
      curr_level = int(line.split(". ")[0].split(".")[1])
      prev_folder_name = folder_name
      folder_name = line.split("Folder Name ")[1]

答案 3 :(得分:0)

您似乎只想:os.system(f'mkdir -p {FolderName}')

答案 4 :(得分:0)

为清楚起见,我不显示文件读取,而是对其进行硬编码,因此,假设您使用可变内容存储从文件读取的内容:

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')]的{​​{1}}(listtuple)中的int

最后,我们可以遍历树:

str

现在,当我使用Linux操作系统时,我的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]) paths,并且['a/b/c', 'a/b/c2', 'a/b', 'a/d/e', 'a/d/e2/f', 'a/d/e2', 'a/d', 'a']将为您的系统使用适当的斜杠。 上面的代码说明:我遍历这棵树,当进入死角时,我将导致它的路径添加到列表os.path.join并删除该叶子(列表paths始终只删除1个元素,因此无需担心删除同一命名文件夹是另一片叶子)。当所有的叶子都被删除时,我就结束了(希望您能理解,但是我无法以更清晰的方式来解释它)

由于remove现在是路径列表,因此我可以简单地使用paths函数。请注意,如果您尝试使dir已经存在,将导致错误,因此我们需要首先检查它是否不存在:

os.makedirs()
相关问题