2012-01-05 15 views
11

मुझे एक फ़ाइल को अपडेट करने की आवश्यकता है। मैंने इसे पढ़ा और परिवर्तनों के साथ इसे लिख दिया। हालांकि, मैं एक अस्थायी फ़ाइल को लिखना पसंद करता हूं और इसे स्थान पर बदलना चाहता हूं।पायथन में, एक ही निर्देशिका में एक और फ़ाइल के रूप में एक tempfile बनाओ?

temp = tempfile.NamedTemporaryFile() 
tempname = temp.name 
temp.write(new_data) 
temp.close() 
os.rename(tempname, data_file_name) 

समस्या यह है कि tempfile.NamedTemporaryFile()/tmp में अस्थायी फ़ाइल जो एक अलग फाइल सिस्टम है बनाता है। इसका मतलब है os.rename() विफल रहता है। अगर मैं shlib.move() का उपयोग करने के बजाय फिर मैं परमाणु अपडेट नहीं है कि "mv"

(समान फाइल सिस्टम, yadda, yadda, आदि में फ़ाइलों के लिए) प्रदान करता है मैं जानता हूँ कि tempfile.NamedTemporaryFile() एक "dir" पैरामीटर लेता है, लेकिन data_file_name "foo.txt" हो सकता है जिस स्थिति में dir = '।'; या data_file_name "/path/to/the/data/foo.txt" हो सकता है जिस स्थिति में dir = "/path/to/the/data"।

मुझे वास्तव में क्या पसंद आएगा temp फ़ाइल data_file_name + "कुछ यादृच्छिक डेटा" होने के लिए है। इस तरह से असफल होने का लाभ होगा जो उपयोगी सुरागों के पीछे छोड़ देगा।

सुझाव?

+3

यदि आप अस्थायी फ़ाइलों के लिए निर्देशिका में नहीं रखना चाहते हैं तो आप पहली जगह अस्थायी फ़ाइल का उपयोग क्यों कर रहे हैं? सामान्य फाइलों का उपयोग करने के खिलाफ क्या बोलता है? –

+1

डेविड: मैं एक अस्थायी फ़ाइल का उपयोग करना चाहता हूं क्योंकि मैं अद्यतन परमाणु होना चाहता हूं (या जैसा कि परमाणु के रूप में os.rename() के साथ हो सकता है)। यही है, अगर फ़ाइल सिस्टम भर जाता है या कोई अन्य समस्या है, तो मैं नहीं चाहता कि फ़ाइल आधे लिखित हो। – TomOnTime

+0

ठीक है, यह हासिल करना मुश्किल हो सकता है, क्योंकि आप कभी भी वास्तव में नहीं जानते हैं, अगर किसी भिन्न फ़ोल्डर में लिखी गई फाइलें आपकी स्थानीय निर्देशिका के समान फाइल सिस्टम पर हैं। मैं किसी प्रकार की प्रतिबद्धता में आपके आउटपुट को व्यवस्थित करने का लाभ देखता हूं। अपेक्षाकृत यह सुनिश्चित करने के लिए कि यह मामला है, मैं शायद अपनी खुद की अस्थायी निर्देशिका का प्रबंधन करूंगा - हालांकि आप इस फ़ोल्डर की सफाई के लिए भी देखभाल करेंगे। –

उत्तर

17

आप उपयोग कर सकते हैं:

  • prefix अस्थायी फ़ाइल मूल फ़ाइल के रूप में एक ही नाम के साथ शुरू करने के लिए।
  • dir यह निर्दिष्ट करने के लिए कि अस्थायी फ़ाइल कहां रखें।
  • os.path.split फ़ाइल नाम से निर्देशिका को विभाजित करने के लिए।

import tempfile 
import os 
dirname, basename = os.path.split(filename) 
temp = tempfile.NamedTemporaryFile(prefix=basename, dir=dirname) 
print(temp.name) 
+0

अगर फ़ाइल नाम = 'foo' तो dirname '' होगा। मैं सुखद आश्चर्यचकित हूं कि नामांकित समकालीनफाइल dir = '' के साथ काम करता है जैसे डीआईआर = कोई नहीं। धन्यवाद! – TomOnTime

+0

बस यह स्पष्ट करने के लिए: आपको नामांकित समकालीन फ़ाइल कन्स्ट्रक्टर को 'हटाएं = गलत' भी पास करना होगा, या फ़ाइल को बंद कर दिया जाएगा। – moeffju

2

मैं "के रूप में कुछ यादृच्छिक डेटा" एक अनूठा अस्थायी फ़ाइल नाम के लिए एक आधार स्ट्रिंग के साथ जोड़ दिया वर्तमान समय का उपयोग करें:

import time 

temp_file_name = data_file_name + str(time.time()) 
+0

यह आकर्षक है, लेकिन मैंने अपने स्वयं के अस्थायी फ़ाइल सिस्टम को चलाने वाले लोगों से पर्याप्त सुरक्षा समस्याएं देखी हैं जिन्हें मैं टेम्पफाइल प्रदान करने वाले किसी का उपयोग करने के बारे में जानता हूं। – TomOnTime

+0

कुछ साल बाद यहां एक अतिरिक्त नोट के रूप में, यदि यह एक ही मिलीसेकंड में दो बार चलता है तो यह संघर्ष होगा, जो ज्यादातर लोगों के उपयोग मामलों में निश्चित रूप से संभव है। टेम्पफाइल के आधिकारिक कार्यान्वयन, उस तरह की चीजों के लिए, और जब आप इससे बचने की कोशिश करते हैं तो दौड़ की स्थिति का उपयोग करना बेहतर होता है। – daboross

4

आप 'निर्देशिका' निर्माता पैरामीटर में एक फ़ाइल स्थान पारित कर सकते हैं। यह आपकी इच्छानुसार काम करता है।

>>> t = tempfile.NamedTemporaryFile(dir="/Users/rafal") 
>>> t.name 
'/Users/rafal/tmplo45Js' 

स्रोत: http://docs.python.org/library/tempfile.html#tempfile.NamedTemporaryFile

+2

जानकारी: फ़ाइल डिटलर बंद होने के तुरंत बाद फ़ाइल हटाएं 'गलत = फ़ाइल हटा दी जाती है। – gecco

+0

यह मानता है कि हम जानते हैं कि डीआईआर क्या है। – TomOnTime

+0

हम जानते हैं कि। ओपी के पहले से ही प्रश्न में डीआईआर और फ़ाइल नाम में पथ बांट रहा है, ताकि यहां इसके बारे में लिखना अनावश्यक हो। –

4

अपने सभी चेकलिस्ट मुझे लगता है कि आप उपयोग करना चाहते हैं को पूरा करने के ...

temp = tempfile.NamedTemporaryFile(prefix=data_file_name, dir=path, 
            delete=False) 

महत्वपूर्ण delete=False है, अन्यथा क्योंकि:

[...] यदि हटाएं सत्य (डिफ़ॉल्ट) है, तो फ़ाइल बंद होने पर फ़ाइल हटा दी जाती है।

+0

यह मानता है कि हम जानते हैं कि पथ क्या है। – TomOnTime

-1

tempfile मॉड्यूल जो आप उपयोग करते हैं अस्थायी फ़ाइलों को प्रबंधित करने का एक सुरक्षित तरीका प्रदान करता है। यदि आप वास्तव में अपने सिस्टम का उपयोग करना चाहते हैं, तो आपको केवल यह पता होना चाहिए कि यह हमलों (विशेष रूप से सिम्लिंक हमलों) के लिए कमजोर हो सकता है।

एक अस्थायी अद्वितीय फ़ाइल नाम (एक नहीं बल्कि लंबे नाम यद्यपि) उत्पन्न करने के लिए एक आसान तरीका है:

import uuid 
import os 

tempfilename = 'myprefix-%s.dat' % str(uuid.uuid4()) 

with open(tempfilename, 'rw') as tempfile: 
    # do stuff 

os.remove(tempfilename) 

लेकिन यह थोड़ा hackish है; वास्तव में tempfile मॉड्यूल का उपयोग करने पर विचार करें prefix और dir पैरामीटर NamedTemporaryFile पर दिए गए अनुसार, अन्य उत्तरों में वर्णित अनुसार।

+0

यह आकर्षक है, लेकिन मैंने लोगों को अपने स्वयं के अस्थायी फ़ाइल सिस्टम को चलाने वाले लोगों के कारण पर्याप्त सुरक्षा समस्याएं देखी हैं जिन्हें मैं टेम्पफाइल प्रदान करता हूं। – TomOnTime

+0

बिल्कुल, इस तरह कुछ का उपयोग उत्पादन कोड में एक बुरा विचार है। ऐसे माहौल में जहां यह कोई चिंता नहीं है (उदाहरण के लिए सिमुलेशन डेटा लॉगिंग), 'यूयूआईडी' एक अद्वितीय यादृच्छिक स्ट्रिंग उत्पन्न करने का एक तरीका प्रस्तुत करता है। –

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