2012-01-04 15 views
12

मेरे पास पहले व्यक्ति (नाम) पहले और उपनाम के साथ, प्रत्येक व्यक्ति के नाम के साथ एकाधिक फ़ोल्डर्स हैं। मैं फ़ोल्डर नामों को बदलना चाहता हूं ताकि उपनाम पहले कॉमा द्वारा पीछा किया जा सके और फिर पहला नाम अनुसरण करें।पायथन में फ़ोल्डर नाम कैसे बदलें?

उदाहरण के लिए, फ़ोल्डर टेस्ट में, मेरे पास है:

C:/Test/John Smith 
C:/Test/Fred Jones 
C:/Test/Ben Jack Martin 

और मैं इस बनाना चाहते:

C:/Test/Smith, John 
C:/Test/Jones, Fred 
C:/Test/Martin, Ben Jack 

मैं os.rename साथ कुछ बातें करने की कोशिश की, लेकिन मैं नहीं कर सके ऐसा लगता है कि यह अलग-अलग नाम की लंबाई के साथ काम नहीं करता है, और मुझे यकीन नहीं था कि उपनाम में अल्पविराम को कैसे सम्मिलित किया जाए।

इसके अलावा, कुछ फ़ोल्डर नाम पहले से ही सही रूप में हैं, इसलिए मुझे इन फ़ोल्डर्स को नामकरण के दौरान छोड़ना होगा। मुझे लगता है कि आप इसे सिर्फ एक जोड़कर कर सकते हैं, ताकि अगर फ़ोल्डर नाम में अल्पविराम शामिल है तो यह जारी रहेगा।

अन्यथा, उपनाम फ़ोल्डर नाम में हमेशा अंतिम शब्द होगा।

आपकी सहायता के लिए धन्यवाद।

उत्तर

25

आप इसे बाहर काफी सीधी-सपाट लिख सकते हैं, os.listdir का उपयोग करने और 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)) 
+0

जब मैंने कोशिश की तो मुझे बताया गया कि "सिस्टम निर्दिष्ट पथ नहीं ढूंढ सकता: 'सी:/टेस्ट /*.*'"। निश्चित नहीं इसका क्या मतलब। – user1130955

+0

@ user1130955 इसका मतलब है कि 'सी:/टेस्ट' आपके सिस्टम पर मौजूद नहीं है। क्या आप निश्चित हैं कि वह निर्देशिका है जहां आपकी उपयोगकर्ता नाम निर्देशिकाएं हैं? – phihag

+0

इसका मतलब है सी: \ टेस्ट पूरी तरह से मौजूद नहीं है। – jgritty

1
os.rename("Joe Blow", "Blow, Joe") 

मेरे लिए ठीक काम करने लगता है। आपको किस हिस्से में परेशानी हो रही है?

+0

जब मैं यह प्रत्येक फ़ोल्डर के लिए अलग-अलग कर यह ठीक है, लेकिन मैं यह सब के माध्यम से एक पाश के लिए काम करने के लिए ही नहीं सकता था फ़ोल्डर्स समस्या यह है कि मुझे नहीं पता कि सभी फ़ोल्डर्स के लिए पहले नाम और उपनाम कैसे निर्दिष्ट करें। – user1130955

+0

ऊपर फिहाग का उदाहरण शायद पूरी तरह से काम करेगा। वह स्ट्रिंग को विभाजित करने के लिए rnpartition का उपयोग करता है। मैं शायद विभाजित() का उपयोग करता, लेकिन उसका उदाहरण काम करना चाहिए। – jgritty

3

मैं rpartition() की phihag के सुझाव की तरह, मैं निम्नलिखित लगता है ज्यादातर बराबर हैं:

>>> 'first second third fourth'.rpartition(' ') 
('first second third', ' ', 'fourth') 
>>> 'first second third fourth'.rsplit(None, 1) 
['first second third', 'fourth'] 

मैं rsplit() पसंद करता हूं क्योंकि मैं विभाजक के बारे में परवाह नहीं करना चाहता, लेकिन मैं यह भी देख सकता हूं कि यह थोड़ा और वर्बोज़ है।

सेटअप

>>> 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'] 

समाधान

>>> 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'] 
संबंधित मुद्दे