سؤال

وأنا أكتب السيناريو الذي يسجل أخطاء من برنامج آخر وإعادة تشغيل البرنامج حيث توقفت عندما يواجه خطأ. لأي سبب من الأسباب، فإن مطوري هذا البرنامج لا يشعر أنه من الضروري وضع هذه الوظيفة في برنامجهم بشكل افتراضي.

وعلى أي حال، ويأخذ البرنامج ملف المدخلات، ويوزع عليه، ويخلق ملف الإخراج. ملف الإدخال في تنسيق معين:

UI - 26474845
TI - the title (can be any number of lines)
AB - the abstract (can also be any number of lines)

عند يلقي البرنامج خطأ، فهو يوفر لك المعلومات المرجعية التي تحتاج إلى تتبع الخطأ - وهي واجهة المستخدم، والذي قسم (عنوان أو مجردة)، ورقم السطر نسبة إلى بداية العنوان أو مجردة. أريد أن تسجيل الجمل المخالف من ملف الإدخال مع دالة التي تأخذ رقم مرجع وملف، يجد الحكم، ويسجل ذلك. أفضل طريقة يمكنني أن أفكر في القيام بذلك ينطوي على المضي قدما من خلال ملف عدد معين من المرات (أي، ن مرات، حيث n هو رقم السطر نسبة إلى بداية seciton). الطريقة التي يبدو من المعقول للقيام بذلك هي:

i = 1
while i <= lineNumber:
    print original.readline()
    i += 1

وأنا لا أرى كيف أن هذا من شأنه أن يجعل لي فقدان البيانات، ولكن بيثون يعتقد أنه سيكون، ويقول ValueError: Mixing iteration and read methods would lose data. لا أحد يعرف كيفية القيام بذلك بشكل صحيح؟

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

المحلول

ويمكنك الحصول على ValueError لأن التعليمات البرمجية ربما تمت for line in original: بالإضافة إلى original.readline(). حل سهل الذي يؤدي إلى حل المشكلة من دون الادلاء البرنامج أبطأ أو تستهلك أكثر الذاكرة يتغير

for line in original:
    ...

إلى

while True:
    line = original.readline()
    if not line: break
    ...

نصائح أخرى

استخدم for و اعدد .

مثال:

for line_num, line in enumerate(file):
    if line_num < cut_off:
        print line

ملاحظة : ل. وهذا يفترض كنت تنظيف بالفعل مؤشرات الملفات الخاصة بك، الخ

وبالإضافة إلى ذلك، يمكن أن تثبت takewhile وظيفة مفيدة إذا كنت تفضل نكهة أكثر وظيفية.

وعلى افتراض انك تحتاج سطر واحد فقط، وهذا يمكن أن يكون عونا

import itertools

def getline(fobj, line_no):
    "Return a (1-based) line from a file object"
    return itertools.islice(fobj, line_no-1, line_no).next() # 1-based!

>>> print getline(open("/etc/passwd", "r"), 4)
'adm:x:3:4:adm:/var/adm:/bin/false\n'

وقد ترغب في التقاط الأخطاء StopIteration (إذا كان الملف خطوط أقل).

وفيما يلي نسخة من دون نمط while True القبيح وبدون وحدات أخرى:

for line in iter(original.readline, ''):
    if …:   # to the beginning of the title or abstract
        for i in range(lineNumber):
            print original.readline(),
        break
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top