webdevqa.jp.net

Pythonのディレクトリ内の複数のファイルの名前を変更する

私はPythonを使用してディレクトリ内のいくつかのファイルの名前を変更しようとしています。

CHEESE_CHEESE_TYPE.***という名前のファイルがあり、CHEESE_を削除して、結果のファイル名がCHEESE_TYPEになるとします。

私はos.path.splitを使用しようとしていますが、それは正しく機能していません。文字列操作の使用も検討しましたが、それでも成功していません。

391
Jeff

os.rename(src, dst) を使用して、ファイルまたはディレクトリの名前を変更したり移動したりします。

$ ls
cheese_cheese_type.bar  cheese_cheese_type.foo
$ python
>>> import os
>>> for filename in os.listdir("."):
...  if filename.startswith("cheese_"):
...    os.rename(filename, filename[7:])
... 
>>> 
$ ls
cheese_type.bar  cheese_type.foo
621
Messa

これはあなたの最新のコメントに基づいたスクリプトです。

#!/usr/bin/env python
from os import rename, listdir

badprefix = "cheese_"
fnames = listdir('.')

for fname in fnames:
    if fname.startswith(badprefix*2):
        rename(fname, fname.replace(badprefix, '', 1))
36
bukzor

次のコードは動作するはずです。現在のディレクトリ内のすべてのファイル名を取ります。ファイル名にパターンCHEESE_CHEESE_が含まれている場合は、名前が変更されます。そうでなければ、ファイル名には何もしません。

import os
for fileName in os.listdir("."):
    os.rename(fileName, fileName.replace("CHEESE_CHEESE_", "CHEESE_"))
17

あなたがすでにディレクトリにいて、あなたのコメントからの「最初の8文字」が常に当てはまると仮定します。 ( "CHEESE_"は7文字ですが…?もしそうなら、以下の8を7に変更してください)

from glob import glob
from os import rename
for fname in glob('*.prj'):
    rename(fname, fname[8:])
15
darelf

私は同じ問題を抱えています、そこでは私がダッシュ-に任意のpdfファイルの空白を置き換えたいです。しかし、ファイルは複数のサブディレクトリにありました。だから、私はos.walk()を使わなければなりませんでした。複数のサブディレクトリを使用する場合は、次のようになります。

import os
for dpath, dnames, fnames in os.walk('/path/to/directory'):
    for f in fnames:
        os.chdir(dpath)
        if f.startswith('cheese_'):
            os.rename(f, f.replace('cheese_', ''))
11
Aziz Alto

これを試して:

import os
import shutil

for file in os.listdir(dirpath):
    newfile = os.path.join(dirpath, file.split("_",1)[1])
    shutil.move(os.path.join(dirpath,file),newfile)

私はあなたがファイル拡張子を削除したくないと思っていますが、あなたはただピリオドで同じ分割をすることができます。

7
krs1

この種のものは、シェル統合を持つIPythonに完全に適合しています。

In [1] files = !ls
In [2] for f in files:
           newname = process_filename(f)
           mv $f $newname

注:これをスクリプトに格納するには、.ipy拡張子を使用し、すべてのシェルコマンドの先頭に!を付けます。

http://ipython.org/ipython-doc/stable/interactive/Shell.html も参照してください。

6
Erik Allik

このコマンドは、 renamer を使用して、現在のディレクトリ内のすべてのファイルから initial "CHEESE_"文字列を削除します。

$ renamer --find "/^CHEESE_/" *
3
Lloyd

これがより一般的な解決策です:

このコードを使用して、ディレクトリ内のすべてのファイル名から特定の文字または文字セットを再帰的に削除し、それらを他の文字、文字セット、または文字なしに置き換えることができます。

import os

paths = (os.path.join(root, filename)
        for root, _, filenames in os.walk('C:\FolderName')
        for filename in filenames)

for path in paths:
    # the '#' in the example below will be replaced by the '-' in the filenames in the directory
    newname = path.replace('#', '-')
    if newname != path:
        os.rename(path, newname)
3
nicholas

あなたの問題は、名前の変更そのものではなく、新しいファイル名を決定することにあると思われます(その場合はos.renameメソッドを使用できます)。

あなたの質問から、どのパターンがあなたが名前を変更したいということであるかはっきりしていません。文字列操作に問題はありません。正規表現はここで必要なものかもしれません。

3
Uri

私はもともと正規表現を使って名前を変更することができ、変更を適用する前に結果のプレビューを表示することができるGUIを探していました。

Linuxでは krename を使いましたが、WindowsではTotal Commanderは正規表現で名前を変更することはできませんでしたが、OSXと同等の無料の同等物は見つからなかったので、再帰的に動作するpythonスクリプトを作成しました。変更を加えずに名前を変更できます。実際にファイル名を変更するには、 ' - w'スイッチを追加してください。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import fnmatch
import sys
import shutil
import re


def usage():
    print """
Usage:
        %s <work_dir> <search_regex> <replace_regex> [-w|--write]

        By default no changes are made, add '-w' or '--write' as last arg to actually rename files
        after you have previewed the result.
        """ % (os.path.basename(sys.argv[0]))


def rename_files(directory, search_pattern, replace_pattern, write_changes=False):

    pattern_old = re.compile(search_pattern)

    for path, dirs, files in os.walk(os.path.abspath(directory)):

        for filename in fnmatch.filter(files, "*.*"):

            if pattern_old.findall(filename):
                new_name = pattern_old.sub(replace_pattern, filename)

                filepath_old = os.path.join(path, filename)
                filepath_new = os.path.join(path, new_name)

                if not filepath_new:
                    print 'Replacement regex {} returns empty value! Skipping'.format(replace_pattern)
                    continue

                print new_name

                if write_changes:
                    shutil.move(filepath_old, filepath_new)
            else:
                print 'Name [{}] does not match search regex [{}]'.format(filename, search_pattern)

if __== '__main__':
    if len(sys.argv) < 4:
        usage()
        sys.exit(-1)

    work_dir = sys.argv[1]
    search_regex = sys.argv[2]
    replace_regex = sys.argv[3]
    write_changes = (len(sys.argv) > 4) and sys.argv[4].lower() in ['--write', '-w']
    rename_files(work_dir, search_regex, replace_regex, write_changes)

使用例

ファイル名の一部を次のように反転します。つまり、m7-08ビットをファイル名の先頭に移動します。

# Before:
Summary-building-mobile-apps-ionic-framework-angularjs-m7-08.mp4

# After:
m7-08_Summary-building-mobile-apps-ionic-framework-angularjs.mp4

これは予行演習を実行し、実際にファイルの名前を変更せずに新しいファイル名を印刷します。

rename_files_regex.py . "([^\.]+?)-(m\\d+-\\d+)" "\\2_\\1"

これは実際の名前変更を行います(-wまたは--writeのどちらかを使用できます)。

rename_files_regex.py . "([^\.]+?)-(m\\d+-\\d+)" "\\2_\\1" --write
2
ccpizza

簡単にするためにos.system関数を使用し、タスクを実行するためにbashを呼び出すことができます。

import os
os.system('mv old_filename new_filename')
2
user5449023

インポートosインポート文字列def rename_files():

#List all files in the directory
file_list = os.listdir("/Users/tedfuller/Desktop/prank/")
print(file_list)

#Change current working directory and print out it's location
working_location = os.chdir("/Users/tedfuller/Desktop/prank/")
working_location = os.getcwd()
print(working_location)

#Rename all the files in that directory
for file_name in file_list:
    os.rename(file_name, file_name.translate(str.maketrans("","",string.digits)))

rename_files()

2
Ted Fuller

これはどうですか :

import re
p = re.compile(r'_')
p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.***
0
Bandan

これは私のために働きます。

import os
for afile in os.listdir('.'):
    filename, file_extension = os.path.splitext(afile)
    if not file_extension == '.xyz':
        os.rename(afile, filename + '.abc')
0
edib