2015-09-03 158 views
0

我有5個目錄,我們稱它們爲dir1,dir2,dir3,dir4,dir5。對於目錄中的文件,將文件重命名爲目錄名稱

這些都是當前目錄。其中每個包含一個名爲title.mkv的文件。我希望將這些文件重命名爲他們在目錄名,即DIR1文件title.mkv,我要重命名爲dir1.mkv。

我也想,然後將文件移動到另一個文件夾。除了os和glob,還需要哪些python工具?

+0

可能'shutil.move()'如果你不想使用'os.rename()' http://stackoverflow.com/questions/8858008/moving-a-file-in- python –

回答

0

如果你有完整的文件名和目錄,重命名這些文件,你可以使用

import os 
f_name = 'E:/temp/nuke.mkv' 
# Removes '/' at the end of string 
while f_name.endswith('/'): 
    f_name = f_name[:-1] 
# Generates List Containing Directories and File Name 
f_name_split = f_name.split('/') 
f_path = '' 
# Iterates Through f_name_split, adding directories to new_f_path 
for i in range(len(f_name_split)-1): 
    f_path += f_name_split[i] + '/' 
# Makes New Name Based On Folder Name 
new_name = f_name_split[-2] + '.mkv' 
# Gets The Old File Name 
f_name = f_name_split[-1] 
# Renames The File 
os.rename(f_path + f_name, f_path + new_name) 

要經過所有的目錄,你可以做到這一點遞歸的,有它的系統輸出到文件[窗口:DIR/S/b/A> file.txt的],或使用os.walk。要移動一個文件,你可以使用os.rename(源,目的地)

0

以下應該工作,雖然你會遇到問題如果每個源文件夾多個文件:

import os 

source_folder = r"c:\my_source_folder" 
target_folder = r"c:\target_folder" 

for directory_path, dirs, files in os.walk(source_folder): 

    # Current directory name 
    directory = os.path.split(directory_path)[1] 

    # Ensure only MKV files are processed 
    files = [file for file in files if os.path.splitext(file)[1].lower() == '.mkv'] 

    # Rename each file 

    for file in files: 
     source = os.path.join(directory_path, file) 
     target = os.path.join(target_folder, directory + ".mkv") 

     try: 
      os.rename(source, target) 
     except OSError: 
      print "Failed to rename: {} to {}".format(source, target) 

它將從源文件夾中搜索所有子文件夾,並使用當前文件夾名稱爲目標名稱。

+0

'os.rename'不能跨文件系統工作。 'shutil.move'的確如此。 –

0

以下函數使用shutil.move,它跨文件系統移動並覆蓋保護以防目標文件存在。文件名可以是相對的。

from os.path import basename, dirname, isfile, abspath, splitext 
from shutil import move 

def rename_to_dirname_and_move(name, dst, overwrite=False, verbose=False): 

    """renames 'name' to its directory name, keeping its extension 
     intact and moves to 'dst' directory across filesystem 
    """ 
    if not isfile(name): 
     raise ValueError("{} is not a file or doesn't exist".format(name)) 

    abs_name = abspath(name) 
    dir_name = basename(dirname(abs_name)) 
    new_name = '{}{}'.format(dir_name, splitext(name)[1]) 
    dst_name = os.path.join(dst, new_name) 

    if not overwrite and isfile(dst_name): 
     raise OSError('file {} exists'.format(dst_name)) 

    try: 
     move(abs_name, dst_name) 
    except Exception as e: 
     print("Can't move {} to {}, error: {}".format(abs_name, dst_name,e)) 
    else: 
     if verbose: 
      print('Moved {} to {}'.format(abs_name, dst_name)) 
相關問題