Мне нужно переместить файлы в несколько папок с помощью Python. У меня есть папка с некоторыми файлами:

aa0123_0.sql
aa0123_1.sql
bb9876_0.sql
bb9876_1.sql
cc5555_0.sql
cc5555_1.sql

Я хотел бы взять только файлы, заканчивающиеся на _0.sql, поэтому aa0123_0.sql, bb9876_0.sql, cc5555_0.sql и заменить "_0" на "_data_for_bi" поэтому файл будет переименован в aa0123_data_for_bi.sql,...

Кроме того, мне нужно переместить их в отдельные папки: AA, BB и CC. Таким образом, файлы, начинающиеся с aa, например "aa0123_0.sql", должны находиться в папке AA, начиная с bb до папки BB и начиная с cc до Папка CC.

-1
DJdrava 18 Янв 2022 в 19:26
1
Что ты уже испробовал? Взгляните на библиотеки Python pathlib и shutil.
 – 
Louis Lac
18 Янв 2022 в 19:42
Как насчет файлов, оканчивающихся на _1?
 – 
Tomerikoo
18 Янв 2022 в 19:43
Мне не нужны файлы с _1, мне нужны файлы с _0.
 – 
DJdrava
18 Янв 2022 в 19:47
Я использовал это для перемещения и переименования файлов stackoverflow. com/questions/42541748/…
 – 
DJdrava
18 Янв 2022 в 19:50
 – 
Louis Lac
18 Янв 2022 в 19:54

2 ответа

Если я понял ваш вопрос, это должно помочь:

import os
# Get the list of files in the current directory
files = os.listdir('.')

for f in files:
    # remove the path if needed
    filename = os.path.basename(f)
    # remove the extension
    basename = os.path.splitext(filename)[0]
    # If filename doesnt contains "_0", skip the file
    if (basename[-2:] != '_0'):
        continue ;
    # Get folder from the first 2 chars of the filename
    folder = (basename[:2]).upper()
    # generate new name
    new_name = basename[:-1] + 'data_for_bi.sql'
    # Put folder and filename together
    target = os.path.join(folder, new_name)
    # Move the file
    os.rename(f, target)

Это помогает?

== РЕДАКТИРОВАТЬ ==

Конечно, вы можете заменить os.listdir('.') на os.listdir('C:\\path\\to\files\\'), но не забудьте также указать цель. Вы можете поместить его в os.path.join('path', 'to', 'file')

Также, если вы используете подсистему Windows Linux, C:\path\to\file будет /mnt/c/path/to/file/

0
vinalti 18 Янв 2022 в 20:15
Могу ли я указать свой путь и не использовать os.listdir('.')? Мне нужно использовать только одну папку. Например C:\\Users\\xxx\data\folder_xxx и перенести в отдельные папки AA,BB,CC.
 – 
DJdrava
18 Янв 2022 в 20:04
Вам нужно будет поместить свой путь в скобку: os.listdir('C:\\Users\\xxx\data\folder_xxx') и настроить цель так, чтобы она была хорошим каталогом. os.listdir должен перечислить файлы в указанном каталоге. --- (Пожалуйста, проголосуйте за мой комментарий или отметьте его как решение, если он помог)
 – 
vinalti
18 Янв 2022 в 20:08

Я бы посмотрел на Python os и shutil. Если я правильно понял ваш вопрос, следующий код должен помочь:

import os
import shutil

path_to_folder = 'C:/Users/Name/...' 
os.chdir(path_to_root_folder)

contents = os.listdir()

for filename in contents:
    if '_0.sql' in filename:
        new_filename    = filename.replace('_0.sql', '_data_for_bi.sql')
        new_filepath = f'{filename[:2].upper()}/{new_filename}'
        shutil.move(filename, new_filepath)

Для этого необходимо, чтобы папки /AA, /BB, /CC и т. д. уже существовали. Если нет, вы можете создать их с помощью os.mkdir(path) внутри цикла for.

0
Tomerikoo 18 Янв 2022 в 20:23