2013-10-28 11 views
7

मेरे पास कुछ पायथन कोड है जो सीएसवी फ़ाइल को पार्स करता है। अब हमारे विक्रेता डेटा फ़ाइल को gzip csv फ़ाइल में बदलने का निर्णय लेते हैं। मैं सोच रहा था कि मुझे क्या न्यूनतम/साफ कोड परिवर्तन करना है। वर्तमान कार्य:पायथन "साथ" कथन वाक्यविन्यास

def load_data(fname, cols=()): 
    ... ... 
    with open(fname) as f: 
     reader = csv.DictReader(f) 
     ... ... 

मैं load_data2() के लिए कोड डुप्लीकेट, और बयान के साथ करने के लिए बदलने के लिए नहीं करना चाहते, सोचा था कि यह पूरी तरह से काम करता है।

with gzip.open(fname) as f: 

मैं कथन के साथ कैसे कारक बना सकता हूं?

def load_data(fname, cols=()): 
    ... ... 
    if fname.endswith('.csv.gz'): 
     with gzip.open(fname) as f: 
    else: 
     with open(fname) as f: 

     reader = csv.DictReader(f) 
     ... ... # code to parse 

उत्तर

6

सार्वभौमिक दृष्टिकोण गतिशील करने के लिए है

openers = { 
    'http': urllib2.urlopen, 
    '.csv.gz': gzip.open 
    '.csv': open 
} 

resource_type = get_resource_type(resource) # determine the type of the resource 

with openers[resource_type](resource) as f: 
    # do stuff ... 

इस तरह, आप दर्द अधिक सलामी बल्लेबाजों, जब जरूरत जोड़ सकते हैं: एक opener चुनें। factory method design pattern का एक और उदाहरण यहां दिया गया है।

8

आप समारोह आप फ़ाइल नाम के गुणों के आधार पर एक अलग चर करने के लिए फ़ाइल खोलने के लिए, का उपयोग करना चाहते बताए द्वारा यह कर सकते हैं:

opener = gzip.open if fname.endswith('.csv.gz') else open 
with opener(fname) as f: 
    ... # code to parse 
+2

आप इसे सीधे 'साथ' कथन में भी कर सकते हैं: 'gzip.open (fname) के साथ अगर fname.endswith (' csv.gz ') अन्यथा खुला (fname) f' – kindall

+0

धन्यवाद, पायथन सुंदर है ! – fivelements

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