كيفية حفظ ملف التكوين / ملف بايثون IO
-
07-07-2019 - |
سؤال
لدي كود بايثون هذا لفتح ملف .cfg والكتابة فيه وحفظه:
import ConfigParser
def get_lock_file():
cf = ConfigParser.ConfigParser()
cf.read("svn.lock")
return cf
def save_lock_file(configurationParser):
cf = configurationParser
config_file = open('svn.lock', 'w')
cf.write(config_file)
config_file.close()
هل يبدو هذا طبيعيًا أم أنني أفتقد شيئًا ما حول كيفية فتح الملفات وحفظها؟هل هناك طريقة أكثر قياسية لقراءة وكتابة ملفات التكوين؟
أسأل لأن لدي طريقتين يبدو أنهما تفعلان نفس الشيء، فهما يحصلان على مقبض ملف التكوين ('cf') باستدعاء cf.set('blah', 'foo' bar) ثم استخدم استدعاء save_lock_file(cf) أعلاه.تعمل إحدى الطرق، أما الطريقة الأخرى فلا تتم الكتابة أبدًا، لست متأكدًا من السبب في هذه المرحلة.
def used_like_this():
cf = get_lock_file()
cf.set('some_prop_section', 'some_prop', 'some_value')
save_lock_file(cf)
المحلول
ومجرد الإشارة إلى أن معالجة ملف التكوين هو أبسط مع ConfigObj.
لقراءة ثم كتابة ملف التكوين:
from configobj import ConfigObj
config = ConfigObj(filename)
value = config['entry']
config['entry'] = newvalue
config.write()
نصائح أخرى
تبدو جيدة بالنسبة لي.
إذا اتصل كلا المكانين get_lock_file
, ، ثم cf.set(...)
, ، وثم save_lock_file
, ، ولم يتم طرح أي استثناءات، يجب أن ينجح هذا.
إذا كان لديك سلاسل رسائل أو عمليات مختلفة تصل إلى نفس الملف، فمن الممكن أن يكون لديك حالة سباق:
- يقرأ الخيط/العملية A الملف
- يقرأ الخيط/العملية B الملف
- يقوم مؤشر الترابط/العملية A بتحديث الملف
- يقوم مؤشر الترابط/العملية B بتحديث الملف
الآن يحتوي الملف فقط على تحديثات B، وليس تحديثات A.
أيضًا، لكتابة الملفات بشكل آمن، لا تنسَ with
بيان (Python 2.5 وما فوق)، سيوفر لك تجربة/أخيرًا (والتي يجب أن تستخدمها إذا كنت لا تستخدمها) with
).من ConfigParser
مستندات:
with open('example.cfg', 'wb') as configfile:
config.write(configfile)
ويعمل بالنسبة لي.
C:\temp>type svn.lock [some_prop_section] Hello=World C:\temp>python ActivePython 2.6.2.2 (ActiveState Software Inc.) based on Python 2.6.2 (r262:71600, Apr 21 2009, 15:05:37) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import ConfigParser >>> def get_lock_file(): ... cf = ConfigParser.ConfigParser() ... cf.read("svn.lock") ... return cf ... >>> def save_lock_file(configurationParser): ... cf = configurationParser ... config_file = open('svn.lock', 'w') ... cf.write(config_file) ... config_file.close() ... >>> def used_like_this(): ... cf = get_lock_file() ... cf.set('some_prop_section', 'some_prop', 'some_value') ... save_lock_file(cf) ... >>> used_like_this() >>> ^Z C:\temp>type svn.lock [some_prop_section] hello = World some_prop = some_value C:\temp>