Python의 디렉터리에 있는 여러 파일 이름 바꾸기
Python을 사용하여 디렉토리의 파일 이름을 바꾸려고 합니다.
, 제가 '이 있다'라는 파일을 가정해 주세요.CHEESE_CHEESE_TYPE.***
and and and려 and and and and and 。CHEESE_
은 " " "가 됩니다.CHEESE_TYPE
지금 있어요.os.path.split
제대로 작동하지 않습니다.스트링 조작도 검토하고 있습니다만, 이것도 성공하지 못했습니다.
파일 또는 디렉토리의 이름을 변경하거나 이동합니다.
$ 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 로 대시 PDF로 변환
-
하지만 파일은 여러 개의 하위 디렉토리에 있었습니다.어쩔 수 래래 so so so so so so so so를 사용했어요.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
및셸에는 "ntension"을 붙입니다.!
.
참고 항목: http://ipython.org/ipython-doc/stable/interactive/shell.html
다음은 보다 일반적인 솔루션입니다.
이 코드를 사용하여 디렉토리 내의 모든 파일 이름에서 특정 문자 또는 문자 집합을 재귀적으로 제거하고 다른 문자, 문자 집합 또는 문자로 대체할 수 있습니다.
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 메서드를 사용할 수 있습니다).
이름을 바꾸려는 패턴이 무엇인지 질문에서 명확하지 않습니다.문자열 조작에는 문제가 없습니다.여기서는 정규 표현이 필요할 수 있습니다.
import os Import 문자열 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()
이 명령어는 renamer를 사용하여 현재 디렉토리의 모든 파일에서 첫 번째 "CHEESE_" 문자열을 삭제합니다.
$ renamer --find "/^CHEESE_/" *
원래 정규 표현을 사용하여 이름을 변경할 수 있는 GUI를 찾고 있었습니다.또, 변경을 적용하기 전에 결과를 미리 볼 수 있는 GUI를 찾고 있었습니다.
Linux 에서는 정상적으로 krename 을 사용하고 있습니다.Windows Total Commander 에서는 regexes 로 이름을 변경합니다만, 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 __name__ == '__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')
난 이거면 돼.
import os
for afile in os.listdir('.'):
filename, file_extension = os.path.splitext(afile)
if not file_extension == '.xyz':
os.rename(afile, filename + '.abc')
이건 어때?
import re
p = re.compile(r'_')
p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.***
언급URL : https://stackoverflow.com/questions/2759067/rename-multiple-files-in-a-directory-in-python
'source' 카테고리의 다른 글
속성 파일에서 목록 읽기 및 스프링 주석 @Value 로딩 (0) | 2022.09.25 |
---|---|
JavaScript 개체에서 키를 제거하려면 어떻게 해야 합니까? (0) | 2022.09.25 |
matplotlib를 사용하면 눈금 레이블의 글꼴 크기를 줄일 수 있습니다. (0) | 2022.09.24 |
$scope 사용.$190과 $190입니다.$on (0) | 2022.09.24 |
MySQLd가 활성 드라이버인지 확인하는 방법 (0) | 2022.09.24 |