سؤال

لدي كود بايثون هذا لفتح ملف .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, ، ولم يتم طرح أي استثناءات، يجب أن ينجح هذا.

إذا كان لديك سلاسل رسائل أو عمليات مختلفة تصل إلى نفس الملف، فمن الممكن أن يكون لديك حالة سباق:

  1. يقرأ الخيط/العملية A الملف
  2. يقرأ الخيط/العملية B الملف
  3. يقوم مؤشر الترابط/العملية A بتحديث الملف
  4. يقوم مؤشر الترابط/العملية 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top