Создать папки на основе имен файлов - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть папка с 1500 файлами Excel.Формат каждого файла выглядит примерно так:

  • 0d20170101abcd.xlsx
  • 1d20170101ef.xlsx
  • 0d20170104g.xlsx
  • 0d20170109hijkl.xlsx
  • 1d20170109mno.xlsx
  • 0d20170110pqr.xlsx

Первым символом имени файла является «0» или «1», за которым следует «d», за которым следует «d»дата создания файла, за которой следует идентификатор клиента (abcd, ef, g, hijkl, mno, pqr). Идентификатор клиента не имеет фиксированной длины и может варьироваться.

Я хочу создать папки для каждого уникальногоdate (имя папки должно быть date) и переместите файлы с одинаковой датой в одну папку.Таким образом, для приведенного выше примера 4 папки (20170101,20170104,20170109,20170110) должны быть созданы с файлами с одинаковыми датами, скопированными в соответствующие папки.

Я хочу знать, есть ли способ сделать этов питоне ?Извините, что не опубликовал пример кода, потому что я не знаю, с чего начать.

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Проверьте этот код.

import os

files = list(x for x in os.listdir('.') if x.is_file())

for i in files:
  d = i[2:10] #get data from filename
  n = i[10:] #get new filename
  if os.path.isdir(i[2:10]):
    os.rename(os.getcwd()+i,os.getcwd()+d+"/"+i)
  else:
    os.mkdir(os.getcwd()+i)
    os.rename(os.getcwd()+i,os.getcwd()+d+"/"+i)

Вот ссылка на ответ

0 голосов
/ 23 сентября 2018

Попробуйте это:

import os, shutil
filepath = "your_file_path"
files = list(x for x in os.listdir(filepath) if x.endswith(".xlsx"))
dates = list(set(x[2:10] for x in files))
for j in dates:
    os.makedirs(filepath + j)
for i in files:
    cid = i[10:]
    for j in dates:
        if j in i:
            os.rename(filepath+i,cid)
            shutil.copy2(filepath+cid, filepath+j)
0 голосов
/ 23 сентября 2018

Попробуйте:

import os
import re

root_path = 'test'


def main():
    # Keep track of directories already created
    created_dirs = []

    # Go through all stuff in the directory
    file_names = os.listdir(root_path)
    for file_name in file_names:
        process_file(file_name, created_dirs)


def process_file(file_name, created_dirs):
    file_path = os.path.join(root_path, file_name)

    # Check if it's not itself a directory - safe guard
    if os.path.isfile(file_path):
        file_date, user_id, file_ext = get_file_info(file_name)

        # Check we could parse the infos of the file
        if file_date is not None \
            and user_id is not None \
            and file_ext is not None:
            # Make sure we haven't already created the directory
            if file_date not in created_dirs:
                create_dir(file_date)
                created_dirs.append(file_date)

            # Move the file and rename it
            os.rename(
                file_path,
                os.path.join(root_path, file_date, '{}.{}'.format(user_id, file_ext)))

            print file_date, user_id


def create_dir(dir_name):
    dir_path = os.path.join(root_path, dir_name)
    if not os.path.exists(dir_path) or not os.path.isdir(dir_path):
        os.mkdir(dir_path)


def get_file_info(file_name):
    match = re.search(r'[01]d(\d{8})([\w+-]+)\.(\w+)', file_name)
    if match:
        return match.group(1), match.group(2), match.group(3)

    return None, None, None


if __name__ == '__main__':
    main()

Обратите внимание, что в зависимости от имен ваших файлов, вы можете изменить (в будущем) регулярное выражение, которое я использую, то есть [01]d(\d{8})([\w+-]+) (выможете поиграть с ним и посмотреть подробности о том, как его прочитать здесь ) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...