سؤال

اتضح أن كلمة "مع" هي كلمة مضحكة للبحث عنها على الإنترنت.

هل يعرف أي شخص ما هي الصفقة مع التعشيش مع البيانات في بيثون؟
لقد كنت أتتبع حشرة زلقة للغاية في البرنامج النصي الذي كنت أكتبه وأظن أن ذلك لأنني أفعل هذا:

with open(file1) as fsock1:
    with open(file2, 'a') as fsock2:
        fstring1 = fsock1.read()
        fstring2 = fsock2.read()

بيثون يلقي عندما أحاول ذلك read() من fsock2. عند التفتيش في مصحح الأخطاء ، هذا لأنه يعتقد أن الملف فارغ. لن يكون هذا مقلقًا باستثناء حقيقة أن تشغيل الكود نفسه بالضبط في تصحيح الأخطاء غير المتقدم في أ with يوضح لي البيان أن الملف ، في الواقع ، مليء بالنص ...

سأستمر على افتراض أن التعشيش الآن with العبارات ليست أمرًا لا ، ولكن إذا كان لدى أي شخص يعرف المزيد رأي مختلف ، فأنا أحب أن أسمع ذلك.

هل كانت مفيدة؟

المحلول

لقد وجدت الحل في وثائق بيثون. قد ترغب في إلقاء نظرة على هذا (بيثون 3) أو هذا (بيثون 2)

إذا كنت تقوم بتشغيل Python 2.7+ ، فيمكنك استخدامه مثل هذا:

with open(file1) as fsock1, open(file2, 'a') as fsock2:
    fstring1 = fsock1.read()
    fstring2 = fsock2.read()

بهذه الطريقة تجنب المسافة البادئة غير الضرورية.

نصائح أخرى

AFAIK لا يمكنك قراءة ملف مفتوح مع وضع إلحاق 'a'.

عند التفتيش في مصحح الأخطاء ، هذا لأنه يعتقد أن الملف فارغ.

أعتقد أن هذا يحدث لأنه لا يمكن قراءة أي شيء بالفعل. حتى لو استطعت ذلك ، عند إلحاق ملف ، يتم نقل مؤشر Seek إلى نهاية الملف استعدادًا للكتابة.

هؤلاء with البيانات تعمل بشكل جيد بالنسبة لي:

with open(file1) as f:
    with open(file2, 'r') as g:   # Read, not append.
        fstring1 = f.read()
        fstring2 = g.read()

لاحظ أن استخدام contextlib.nested, ، كما اقترح ملصق آخر ، من المحتمل أن يكون محفوفًا بالمخاطر هنا. دعنا نقول أنك تفعل هذا:

with contextlib.nested(open(file1, "wt"), open(file2)) as (f_out, f_in):
   ...

يتم إنشاء مديري السياق هنا واحدة في وقت واحد. هذا يعني أنه إذا فشل فتح File2 (على سبيل المثال ، لأنه غير موجود) ، فلن تتمكن من الانتهاء بشكل صحيح من File1 وعليك تركه حتى جامع القمامة. هذا أمر سيء للغاية.

لا توجد مشكلة في التعشيش with البيانات - بدلاً من ذلك ، أنت تفتح file2 للإلحاق ، لذلك لا يمكنك القراءة منه.

إذا كنت لا تحب التعشيش with العبارات ، لأي سبب من الأسباب ، يمكنك في كثير من الأحيان تجنب ذلك مع contextlib.nested وظيفة. ومع ذلك ، لن يصنع رمزًا مكسورًا (على سبيل المثال ، رمز يفتح ملفًا للإلحاق ثم يحاول قراءته بدلاً من ذلك) العمل ، ولن يتداخل معجميًا with عبارات كسر رمز هذا جيد خلاف ذلك.

بالنسبة للبحث عن "مع" ، فإن بادئة كلمة مع "+" سيمنع Google من تجاهلها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top