Saya memiliki beberapa folder yang masing-masing berisi nama orang, dengan nama depan di depan dan nama belakang di belakang. Saya ingin mengubah nama folder sehingga nama belakang diikuti dengan koma terlebih dahulu, lalu diikuti nama depan.
Sebagai contoh, dalam folder Test, saya memiliki:
C:/Test/John Smith
C:/Test/Fred Jones
C:/Test/Ben Jack Martin
dan saya ingin membuat ini:
C:/Test/Smith, John
C:/Test/Jones, Fred
C:/Test/Martin, Ben Jack
Saya telah mencoba beberapa hal dengan os.rename namun saya tidak dapat membuatnya bekerja dengan panjang nama yang bervariasi, dan saya tidak yakin bagaimana cara menyisipkan koma ke dalam nama belakang.
Selain itu, beberapa nama folder sudah dalam bentuk yang benar, jadi saya harus melewatkan folder-folder ini selama penggantian nama. Saya pikir Anda dapat melakukan ini dengan hanya menambahkan if, sehingga jika nama folder mengandung koma, maka nama folder akan dilanjutkan.
Jika tidak, nama keluarga akan selalu menjadi kata terakhir dalam nama folder.
Terima kasih atas bantuan yang dapat Anda berikan.
Anda dapat menuliskannya dengan cukup mudah, menggunakan os.listdir
dan fungsi os.path:
import os
basedir = 'C:/Test'
for fn in os.listdir(basedir):
if not os.path.isdir(os.path.join(basedir, fn)):
continue # Not a directory
if ',' in fn:
continue # Already in the correct form
if ' ' not in fn:
continue # Invalid format
firstname,_,surname = fn.rpartition(' ')
os.rename(os.path.join(basedir, fn),
os.path.join(basedir, surname + ', ' + firstname))
Saya suka saran phihag tentang rpartition()
, saya pikir yang berikut ini hampir sama:
>>> 'first second third fourth'.rpartition(' ')
('first second third', ' ', 'fourth')
>>> 'first second third fourth'.rsplit(None, 1)
['first second third', 'fourth']
Saya lebih suka rsplit()
karena saya tidak ingin peduli dengan pemisahnya, tetapi saya juga bisa melihat bahwa itu sedikit lebih bertele-tele.
Penyiapan
>>> base = 'C:\\Test'
>>> os.makedirs(os.path.join(base, 'John Smith'))
>>> os.makedirs(os.path.join(base, 'Fred Jones'))
>>> os.makedirs(os.path.join(base, 'Ben Jack Martin'))
>>> os.listdir(base)
['Ben Jack Martin', 'Fred Jones', 'John Smith']
Solusi
>>> for old_name in os.listdir(base):
# [::-1] is slice notation for "reverse"
new_name = ', '.join(old_name.rsplit(None, 1)[::-1])
os.rename(os.path.join(base, old_name),
os.path.join(base, new_name))
>>> os.listdir(base)
['Jones, Fred', 'Martin, Ben Jack', 'Smith, John']