Создание папок и вложенных папок из списка с 1 файлом в каждой

#python #pandas #for-loop #mkdir

#python #pandas #для цикла #mkdir

Вопрос:

У меня есть фрейм данных, подобный этому:

 mgr1       mgr2      mgr3
abc        def       fed
asd        dij       
sdf
  

df действительно содержит нули

Я пытаюсь создать каталог, в котором уникальное mgr3 значение (ы) — это имя папки верхнего уровня, mgr2 уникальные значения — это подпапки, mgr1 уникальные значения — это папки во второй подпапке и т.д. А затем добавьте только один текстовый файл в каждую папку.

Я пошел по пути превращения каждого столбца в переменную с уникальными строками, а затем попытался выполнить некоторый цикл 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 = "UsersmaxDownloadsusers_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
  

Ответ №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 для создания всех путей, затем просмотрите список путей и создайте его.

Комментарии:

1. я только что добавил свою попытку к сообщению. Не уверен, что я делаю не так?!

2. Попробуйте изменить df = pd.read_csv('sas-user-mappings-to-ceo.csv') на df = pd.read_csv('sas-user-mappings-to-ceo.csv', encoding = 'utf-8') Его проблему с чтением фактического csv. Если это не сработает, вам придется попробовать другую кодировку.

3. Также убедитесь, что вы не перезаписываете ‘pathToWrite’ в цикле for при создании всех каталогов.

4. хорошо, хороший вызов. я добавил latin1, а затем set() вокруг каждого из списков. они должны быть уникальными списками. но когда я запускаю строку путей — я получаю сообщение об ошибке: MemoryError . I форма df равна 1219, 10. это слишком большой?

5. если вы хотели, чтобы они были уникальными, измените tolist() на .unique().tolist() , не меняйте его на set.