Jawaban:
Mengganti nama seperti itu cukup mudah, misalnya dengan modul os dan glob :
import glob, os
def rename(dir, pattern, titlePattern):
for pathAndFilename in glob.iglob(os.path.join(dir, pattern)):
title, ext = os.path.splitext(os.path.basename(pathAndFilename))
os.rename(pathAndFilename,
os.path.join(dir, titlePattern % title + ext))
Anda kemudian dapat menggunakannya dalam contoh Anda seperti ini:
rename(r'c:\temp\xx', r'*.doc', r'new(%s)')
Contoh di atas akan mengonversi semua *.doc
file dalam c:\temp\xx
dir ke new(%s).doc
, di mana %s
nama dasar file sebelumnya (tanpa ekstensi).
Saya lebih suka menulis satu baris kecil untuk setiap penggantian yang harus saya lakukan daripada membuat kode yang lebih umum dan kompleks. Misalnya:
Ini menggantikan semua garis bawah dengan tanda hubung di file yang tidak tersembunyi di direktori saat ini
import os
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]
rename
:(
no such file error
ingat os.rename
perlu jalur penuh
Jika Anda tidak keberatan menggunakan ekspresi reguler, maka fungsi ini akan memberi Anda banyak kekuatan dalam mengganti nama file:
import re, glob, os
def renamer(files, pattern, replacement):
for pathname in glob.glob(files):
basename= os.path.basename(pathname)
new_filename= re.sub(pattern, replacement, basename)
if new_filename != basename:
os.rename(
pathname,
os.path.join(os.path.dirname(pathname), new_filename))
Jadi dalam contoh Anda, Anda dapat melakukannya (dengan asumsi itu adalah direktori saat ini di mana file tersebut berada):
renamer("*.doc", r"^(.*)\.doc$", r"new(\1).doc")
tetapi Anda juga dapat memutar kembali ke nama file awal:
renamer("*.doc", r"^new\((.*)\)\.doc", r"\1.doc")
dan lainnya.
Saya memiliki ini untuk hanya mengganti nama semua file di subfolder folder
import os
def replace(fpath, old_str, new_str):
for path, subdirs, files in os.walk(fpath):
for name in files:
if(old_str.lower() in name.lower()):
os.rename(os.path.join(path,name), os.path.join(path,
name.lower().replace(old_str,new_str)))
Saya mengganti semua kejadian old_str dengan kasus apapun dengan new_str.
Coba: http://www.mattweber.org/2007/03/04/python-script-renamepy/
Saya suka file musik, film, dan gambar saya diberi nama dengan cara tertentu. Saat saya mendownload file dari internet, biasanya file tersebut tidak mengikuti konvensi penamaan saya. Saya menemukan diri saya secara manual mengganti nama setiap file agar sesuai dengan gaya saya. Ini menjadi sangat cepat tua, jadi saya memutuskan untuk menulis program untuk melakukannya untuk saya.
Program ini dapat mengubah nama file menjadi huruf kecil semua, mengganti string dalam nama file dengan apapun yang Anda inginkan, dan memotong sejumlah karakter dari depan atau belakang nama file.
Kode sumber program juga tersedia.
Saya telah menulis skrip python sendiri. Argumen ini mengambil jalur direktori tempat file berada dan pola penamaan yang ingin Anda gunakan. Namun, itu mengganti nama dengan melampirkan nomor tambahan (1, 2, 3 dan seterusnya) ke pola penamaan yang Anda berikan.
import os
import sys
# checking whether path and filename are given.
if len(sys.argv) != 3:
print "Usage : python rename.py <path> <new_name.extension>"
sys.exit()
# splitting name and extension.
name = sys.argv[2].split('.')
if len(name) < 2:
name.append('')
else:
name[1] = ".%s" %name[1]
# to name starting from 1 to number_of_files.
count = 1
# creating a new folder in which the renamed files will be stored.
s = "%s/pic_folder" % sys.argv[1]
try:
os.mkdir(s)
except OSError:
# if pic_folder is already present, use it.
pass
try:
for x in os.walk(sys.argv[1]):
for y in x[2]:
# creating the rename pattern.
s = "%spic_folder/%s%s%s" %(x[0], name[0], count, name[1])
# getting the original path of the file to be renamed.
z = os.path.join(x[0],y)
# renaming.
os.rename(z, s)
# incrementing the count.
count = count + 1
except OSError:
pass
Semoga ini berhasil untuk Anda.
Berada di direktori tempat Anda perlu melakukan penggantian nama.
import os
# get the file name list to nameList
nameList = os.listdir()
#loop through the name and rename
for fileName in nameList:
rename=fileName[15:28]
os.rename(fileName,rename)
#example:
#input fileName bulk like :20180707131932_IMG_4304.JPG
#output renamed bulk like :IMG_4304.JPG
os.chdir(path_of_directory)
directoryName = "Photographs"
filePath = os.path.abspath(directoryName)
filePathWithSlash = filePath + "\\"
for counter, filename in enumerate(os.listdir(directoryName)):
filenameWithPath = os.path.join(filePathWithSlash, filename)
os.rename(filenameWithPath, filenameWithPath.replace(filename,"DSC_" + \
str(counter).zfill(4) + ".jpg" ))
# e.g. filename = "photo1.jpg", directory = "c:\users\Photographs"
# The string.replace call swaps in the new filename into
# the current filename within the filenameWitPath string. Which
# is then used by os.rename to rename the file in place, using the
# current (unmodified) filenameWithPath.
# os.listdir delivers the filename(s) from the directory
# however in attempting to "rename" the file using os
# a specific location of the file to be renamed is required.
# this code is from Windows
Saya memiliki masalah serupa, tetapi saya ingin menambahkan teks ke awal nama file dari semua file dalam sebuah direktori dan menggunakan metode serupa. Lihat contoh di bawah ini:
folder = r"R:\mystuff\GIS_Projects\Website\2017\PDF"
import os
for root, dirs, filenames in os.walk(folder):
for filename in filenames:
fullpath = os.path.join(root, filename)
filename_split = os.path.splitext(filename) # filename will be filename_split[0] and extension will be filename_split[1])
print fullpath
print filename_split[0]
print filename_split[1]
os.rename(os.path.join(root, filename), os.path.join(root, "NewText_2017_" + filename_split[0] + filename_split[1]))
bagi saya di direktori saya, saya memiliki banyak subdir, setiap subdir memiliki banyak gambar, saya ingin mengubah semua gambar subdir menjadi 1.jpg ~ n.jpg
def batch_rename():
base_dir = 'F:/ad_samples/test_samples/'
sub_dir_list = glob.glob(base_dir + '*')
# print sub_dir_list # like that ['F:/dir1', 'F:/dir2']
for dir_item in sub_dir_list:
files = glob.glob(dir_item + '/*.jpg')
i = 0
for f in files:
os.rename(f, os.path.join(dir_item, str(i) + '.jpg'))
i += 1
(jawaban saya sendiri) https://stackoverflow.com/a/45734381/6329006
# another regex version
# usage example:
# replacing an underscore in the filename with today's date
# rename_files('..\\output', '(.*)(_)(.*\.CSV)', '\g<1>_20180402_\g<3>')
def rename_files(path, pattern, replacement):
for filename in os.listdir(path):
if re.search(pattern, filename):
new_filename = re.sub(pattern, replacement, filename)
new_fullname = os.path.join(path, new_filename)
old_fullname = os.path.join(path, filename)
os.rename(old_fullname, new_fullname)
print('Renamed: ' + old_fullname + ' to ' + new_fullname
Jika Anda ingin mengubah nama file dalam editor (seperti vim), perpustakaan klik dilengkapi dengan perintah click.edit()
, yang dapat digunakan untuk menerima masukan pengguna dari editor. Berikut adalah contoh bagaimana ini dapat digunakan untuk memfaktor ulang file dalam direktori.
import click
from pathlib import Path
# current directory
direc_to_refactor = Path(".")
# list of old file paths
old_paths = list(direc_to_refactor.iterdir())
# list of old file names
old_names = [str(p.name) for p in old_paths]
# modify old file names in an editor,
# and store them in a list of new file names
new_names = click.edit("\n".join(old_names)).split("\n")
# refactor the old file names
for i in range(len(old_paths)):
old_paths[i].replace(direc_to_refactor / new_names[i])
Saya menulis aplikasi baris perintah yang menggunakan teknik yang sama, tetapi itu mengurangi volatilitas skrip ini, dan hadir dengan lebih banyak opsi, seperti pemfaktoran ulang rekursif. Ini adalah tautan ke halaman github . Ini berguna jika Anda menyukai aplikasi baris perintah, dan tertarik untuk membuat beberapa pengeditan cepat pada nama file. (Aplikasi saya mirip dengan perintah "bulkrename" yang ditemukan di ranger ).
import glob2
import os
def rename(f_path, new_name):
filelist = glob2.glob(f_path + "*.ma")
count = 0
for file in filelist:
print("File Count : ", count)
filename = os.path.split(file)
print(filename)
new_filename = f_path + new_name + str(count + 1) + ".ma"
os.rename(f_path+filename[1], new_filename)
print(new_filename)
count = count + 1
%
simbol digunakan dalam perintahos.path.join(dir, titlePattern % title + ext)
? Saya tahu%
ini untuk operasi modulo dan juga digunakan sebagai operator format. Tapi biasanya diikuti dengans
atauf
untuk menentukan format. Mengapa tidak ada (spasi) segera setelah%
dalam perintah tersebut?