2012-10-22 9 views
33

पायथन के बारे में सीखते समय, मैं इस कोड पर आया, जो एक टेक्स्ट फ़ाइल लेता है, प्रत्येक पंक्ति को एक सरणी में विभाजित करता है, और इसे एक कस्टम शब्दकोश में डालता है, जहां सरणी [0] है कुंजी और सरणी [1] मूल्य है:पायथन में स्ट्रिंग.स्ट्रिप()

my_dict = {} 

infile = open("file.txt") 
for line in infile: 
    #line = line.strip() 
    #parts = [p.strip() for p in line.split("\t")] 
    parts = [p for p in line.split("\t")] 
    my_dict[parts[0]] = parts[1] 
    print line 

for key in my_dict: 
    print "key: " + key + "\t" + "value " + my_dict[key] 

मैं बंद और पर टिप्पणी की लाइनों के साथ कार्यक्रम भाग गया और मैं एक ही परिणाम मिला। (निश्चित रूप से नीचे दी गई रेखा के साथ दूसरी टिप्पणी वाली रेखा को बदलना)। ऐसा लगता है कि एक स्ट्रिप() करना वैकल्पिक है। क्या इसे छोड़ने के लिए बेहतर अभ्यास है?

उत्तर

52

यदि आप कोड और आपका प्रोग्राम अभी भी काम कर सकते हैं, तो हाँ, वह कोड वैकल्पिक था।

.strip() रिक्त स्थान, टैब, न्यूलाइन और कैरिज रिटर्न सहित शुरुआत और अंत में सभी व्हाइटस्पेस को हटा देता है। इसे छोड़कर कोई नुकसान नहीं होता है, और आपके प्रोग्राम को फ़ाइल में डाले गए अप्रत्याशित अतिरिक्त व्हाइटस्पेस से निपटने की अनुमति देता है।

उदाहरण के लिए, .strip() का उपयोग करके, एक फ़ाइल में निम्न दो पंक्तियों में एक ही अंतिम परिणाम के लिए नेतृत्व करेंगे:

foo\tbar \n 
foo\tbar\n 

मैं में छोड़

+2

यह इस विशेष इनपुट के लिए वैकल्पिक था, लेकिन आम तौर पर कम से कम कुछ मात्रा में विकृत इनपुट के खिलाफ सुरक्षा करना अच्छा अभ्यास है। लाइनों के अंत में अतिरिक्त सफेद स्थान इतना आम है (विशेष रूप से जब फ़ाइलों को हाथ से संपादित किया जा सकता है) कि मैं वस्तुतः हमेशा .strip() का उपयोग करता हूं। –

+0

मुझे लगता है कि स्ट्रिप कॉल करने के बाद दो लाइनें अलग होंगी, पहले टैब के बाद एक जगह होगी। – Ant

+0

@ एंट: हाँ, यह एक गलती थी; '\ t' के आस-पास आंतरिक सफेद स्थान हटा दिया जाना चाहिए था। –

13

इस मामले में, आप कहते हैं चाहते हैं। कुछ अंतर हो सकता है। इस मामले में

"foo\tbar " 

, यदि आप strip, तो आप {"foo":"bar"} शब्दकोश प्रविष्टि के रूप में मिल जाएगा: की तरह एक लाइन पर विचार करें। आप पट्टी नहीं है, तो आप {"foo":"bar "} (ध्यान दें अंत में अतिरिक्त स्थान)

ध्यान दें कि अगर आप line.split('\t') के बजाय line.split() उपयोग करते हैं, आप हर खाली स्थान के चरित्र और "strip ing" होगा पर विभाजित कर देंगे मिलेगा स्वचालित रूप से विभाजन के दौरान किया जाना चाहिए। दूसरे शब्दों में:

line.split() 

लेकिन:

line.split(delimiter) 
0

:

line.strip().split(delimiter) 

जरूरी के बराबर नहीं है

line.strip().split() 

हमेशा समान हैस्ट्रिंग के आरंभ और अंत से व्हाइटस्पेस को हटा देता है। यदि आप व्हाइटस्पेस चाहते हैं, तो स्ट्रिप को कॉल न करें।

0

नहीं, उन्हें छोड़ने के लिए बेहतर अभ्यास है।

पट्टी के बिना(), आप खाली कुंजी और मूल्यों हो सकता है:

apples<tab>round, fruity things 
oranges<tab>round, fruity things 
bananas<tab> 
पट्टी के बिना

(), केले शब्दकोश में मौजूद है, लेकिन मूल्य के रूप में कोई रिक्त स्ट्रिंग के साथ है। स्ट्रिप() के साथ, यह कोड अपवाद फेंक देगा क्योंकि यह केला रेखा के टैब को स्ट्रिप करता है।

+2

* एक अपवाद फेंक देगा *। कार्यक्रम के लक्ष्यों के आधार पर यह वांछनीय हो सकता है। –

6

strip कुछ भी नहीं करता है, आपकी स्ट्रिंग में व्हाइटस्पेस को हटा देता है।यदि आप अपनी स्ट्रिंग के आगे और पीछे से अतिरिक्त व्हाइटस्पेस को हटाना चाहते हैं, तो आप स्ट्रिप का उपयोग कर सकते हैं।

In [2]: x = "something \t like  \t this" 
In [4]: x.split('\t') 
Out[4]: ['something ', ' like  ', ' this'] 

देखें, \t साथ बंटवारे के बाद भी वहाँ है पहले और दूसरे आइटम जो अपने कोड में पट्टी का उपयोग कर हटाया जा सकता है में अतिरिक्त व्हाइट:

उदाहरण स्ट्रिंग जो कि उदाहरण देकर स्पष्ट कर सकते हैं यह है।

संबंधित मुद्दे