【问题标题】:Create folders and subfolders from list with 1 file in each从列表中创建文件夹和子文件夹,每个文件夹中有 1 个文件
【发布时间】:2020-09-17 18:03:50
【问题描述】:

我有一个这样的数据框:

mgr1       mgr2      mgr3
abc        def       fed
asd        dij       
sdf

df 确实包含空值

我正在尝试创建一个目录,其中唯一的 mgr3 值是顶级文件夹的名称,mgr2 唯一值是子文件夹,mgr1 唯一值是第二个子文件夹中的文件夹等。然后在每个文件夹中添加一个 txt 文件。

我将每列转换为具有唯一字符串的变量,然后尝试执行一些 for 循环以基于这些字符串创建文件夹,但我没有成功。

#someting like this
mgr1 = list(set(df.mgr1))
mgr1 = [x for x in mgr1 if str(x) != 'nan']
mgr1 = ''.join(mgr1)
# print(mgr1)

for i in mgr1:
    os.system ("mkdir "+i)
    for j in range (1):
            os.system ("touch "+str(i)+"/"+str(j)+".txt")

有什么想法吗?

尝试 1:

import os
import sys
import pandas as pd
import itertools

df = pd.read_csv('sas-user-mappings-to-ceo.csv')

eight = df.loc[~df['mgr8'].isnull(), 'mgr8'].tolist()
seven = df.loc[~df['mgr7'].isnull(), 'mgr7'].tolist()
six = df.loc[~df['mgr6'].isnull(), 'mgr6'].tolist()
five = df.loc[~df['mgr5'].isnull(), 'mgr5'].tolist()
four = df.loc[~df['mgr4'].isnull(), 'mgr4'].tolist()
three = df.loc[~df['mgr3'].isnull(), 'mgr3'].tolist()
two = df.loc[~df['mgr2'].isnull(), 'mgr2'].tolist()
one = df.loc[~df['mgr1'].isnull(), 'mgr1'].tolist()
user_name = df.loc[~df['user_name'].isnull(), 'user_name'].tolist()
# third = df.loc[~df['user_lid'].isnull(), 'user_lid'].tolist()

paths = [list(x) for x in itertools.product(eight, seven, six, five, four, three, two, one, user_name)]

for pathToWrite in paths:
    pathToWrite = "\Users\max\Downloads\users_visual"
    toCreate = os.path.join("C:", pathToWrite)

    os.mkdir(toCreate)

error: SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \UXXXXXXXX escape

【问题讨论】:

    标签: python pandas for-loop mkdir


    【解决方案1】:
    import itertools
    
    base = df.loc[~df['mgr3'].isnull(), 'mgr3'].tolist()
    sec = df.loc[~df['mgr2'].isnull(), 'mgr2'].tolist()
    third = df.loc[~df['mgr1'].isnull(), 'mgr1'].tolist()
    
    paths = [list(x) for x in itertools.product(base, sec, third)]
    
    for pathToWrite in paths:
        #change the path to where ever you need to
        toCreate = os.path.join("C:", *pathToWrite)
    
        os.mkdir(toCreate)
    
    

    在单独的列表中获取所有路径。由于我不知道您的列是否已订购,因此我只是在单独的行上进行了操作。使用 itertools 创建所有路径,然后遍历路径列表并制作它。

    【讨论】:

    • 我刚刚在帖子中添加了我的尝试。不知道我做错了什么?!
    • 尝试将 df = pd.read_csv('sas-user-mappings-to-ceo.csv') 更改为 df = pd.read_csv('sas-user-mappings-to-ceo.csv', encoding = 'utf-8') 这是读取实际 csv 的问题。如果这不起作用,您将不得不尝试另一种编码。
    • 同时确保你在创建所有目录时不要在 for 循环中覆盖 'pathToWrite'。
    • 好的,很好。我在每个列表周围添加了 latin1 然后 set() 。需要它们是唯一的列表。但是当我运行路径行时 - 我收到一个错误:MemoryError。我的 df 形状是 1219, 10。这个太大了吗?
    • 如果您希望它们是唯一的,请将tolist() 更改为.unique().tolist(),不要将其更改为集合。
    猜你喜欢
    • 2020-03-03
    • 2022-01-21
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多