私はPythonを使用してディレクトリ内のいくつかのファイルの名前を変更しようとしています。
CHEESE_CHEESE_TYPE.***
という名前のファイルがあり、CHEESE_
を削除して、結果のファイル名がCHEESE_TYPE
になるとします。
私はos.path.split
を使用しようとしていますが、それは正しく機能していません。文字列操作の使用も検討しましたが、それでも成功していません。
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
これはあなたの最新のコメントに基づいたスクリプトです。
#!/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))
次のコードは動作するはずです。現在のディレクトリ内のすべてのファイル名を取ります。ファイル名にパターンCHEESE_CHEESE_
が含まれている場合は、名前が変更されます。そうでなければ、ファイル名には何もしません。
import os
for fileName in os.listdir("."):
os.rename(fileName, fileName.replace("CHEESE_CHEESE_", "CHEESE_"))
あなたがすでにディレクトリにいて、あなたのコメントからの「最初の8文字」が常に当てはまると仮定します。 ( "CHEESE_"は7文字ですが…?もしそうなら、以下の8を7に変更してください)
from glob import glob
from os import rename
for fname in glob('*.prj'):
rename(fname, fname[8:])
私は同じ問題を抱えています、そこでは私がダッシュ-
に任意の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_', ''))
これを試して:
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)
私はあなたがファイル拡張子を削除したくないと思っていますが、あなたはただピリオドで同じ分割をすることができます。
この種のものは、シェル統合を持つ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 も参照してください。
このコマンドは、 renamer を使用して、現在のディレクトリ内のすべてのファイルから initial "CHEESE_"文字列を削除します。
$ renamer --find "/^CHEESE_/" *
これがより一般的な解決策です:
このコードを使用して、ディレクトリ内のすべてのファイル名から特定の文字または文字セットを再帰的に削除し、それらを他の文字、文字セット、または文字なしに置き換えることができます。
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)
あなたの問題は、名前の変更そのものではなく、新しいファイル名を決定することにあると思われます(その場合はos.renameメソッドを使用できます)。
あなたの質問から、どのパターンがあなたが名前を変更したいということであるかはっきりしていません。文字列操作に問題はありません。正規表現はここで必要なものかもしれません。
私はもともと正規表現を使って名前を変更することができ、変更を適用する前に結果のプレビューを表示することができる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
簡単にするためにos.system関数を使用し、タスクを実行するためにbashを呼び出すことができます。
import os
os.system('mv old_filename new_filename')
インポート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()
import re
p = re.compile(r'_')
p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.***
これは私のために働きます。
import os
for afile in os.listdir('.'):
filename, file_extension = os.path.splitext(afile)
if not file_extension == '.xyz':
os.rename(afile, filename + '.abc')