python - read - الطريقة الصحيحة لكتابة خط للملف؟




python read file line by line (6)

إذا كنت تكتب الكثير من البيانات والسرعة هي مصدر قلق يجب أن تذهب مع f.write(...) . لقد قمت بإجراء مقارنة سريعة للسرعة وكانت أسرع بكثير من print(..., file=f) عند إجراء عدد كبير من عمليات الكتابة.

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

في المتوسط ​​، تم الانتهاء من write في جهاز 2.45 على الجهاز ، في حين استغرق print حوالي 4 مرات (9.76 ثانية). ومع ذلك ، في معظم سيناريوهات العالم الواقعي ، لن تكون هذه مشكلة.

إذا اخترت الذهاب print(..., file=f) ، فربما ستجد أنك ستحتاج إلى منع الخط الجديد من وقت لآخر ، أو استبداله بشيء آخر. ويمكن القيام بذلك عن طريق تحديد معلمة end الاختيارية ، على سبيل المثال ؛

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

أيًا كانت الطريقة التي تختارها ، فأنا أقترح عليك استخدام with ذلك لأنها تجعل التعليمة البرمجية أسهل للقراءة.

تحديث : يفسر هذا الاختلاف في الأداء بحقيقة أن write مخزنة بشكل كبير وتعود قبل أن تتم الكتابة إلى القرص بالفعل (انظر هذه الإجابة ) ، بينما تستخدم print (على الأرجح) التخزين المؤقت للخط. سيكون الاختبار البسيط لهذا هو التحقق من الأداء للكتابة الطويلة أيضاً ، حيث تكون المساوئ (من حيث السرعة) لتدبير الخط أقل وضوحاً.

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

ويصبح الفرق في الأداء الآن أقل وضوحًا بكثير ، مع متوسط ​​وقت قدره 2.20 ثانية write و 3.10 ثانية print . إذا كنت بحاجة إلى تجميع مجموعة من السلاسل للحصول على أداء خط loooong هذا ، فستكون حالات الاستخدام حيث تكون print أكثر كفاءة نادرة بعض الشيء.

اعتدت القيام print >>f, "hi there"

ومع ذلك ، يبدو أن print >> يتم إهمالها. ما هي الطريقة الموصى بها لتنفيذ السطر أعلاه؟

تحديث : فيما يتعلق بكل هذه الإجابات مع "\n" ... هل هذا عالمي أم خاص بـ Unix؟ IE ، هل يجب أن أفعل "\r\n" على نظام Windows؟


عندما قلت الخط ، فهذا يعني أن بعض الأحرف المسلسلة تنتهي إلى \ n. يجب أن يكون الخط آخر في مرحلة ما ، لذا يجب أن نضع في الاعتبار "\ n" في نهاية كل سطر. هنا هو الحل:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write('Hello')

في وضع الإلحاق بعد كل كتابة ، ينتقل المؤشر إلى السطر الجديد ، إذا كنت تريد استخدام وضع "w" ، يجب إضافة أحرف "\ n" في نهاية دالة write ():

the_file.write('Hello'+'\n')

لا أعتقد أن هناك طريقة "صحيحة".

سأستخدم:

with open ('myfile', 'a') as f: f.write ('hi there\n')

في ذكرى تيم توادي .


يجب أن يكون هذا بسيطًا كما يلي:

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

من التوثيق:

لا تستخدم os.linesep سطر عند كتابة الملفات المفتوحة في وضع النص (الافتراضي) ؛ استخدم "\ n" واحدة بدلاً من ذلك ، على جميع الأنظمة الأساسية.

بعض القراءة المفيدة:


يوصي مستندات الثعبان بهذه الطريقة:

with open('file_to_write', 'w') as f:
    f.write('file contents')

هذه هي الطريقة التي أقوم بها

بيان من docs.python.org :

من الجيد استخدام الكلمة الأساسية "مع" عند التعامل مع كائنات الملف. هذا له ميزة أن الملف مغلق بشكل صحيح بعد انتهاء المجموعة ، حتى إذا تم رفع استثناء على الطريق. كما أنها أقصر بكثير من كتابة محاولات محاولة النهاية.


فيما يتعلق os.linesep:

فيما يلي جلسة لمترجم فوري بلغة Python 2.7.1 غير محررة على نظام Windows:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

على نظام التشغيل Windows:

كما هو متوقع ، لا ينتج os.linesep نفس النتيجة مثل '\n' . لا توجد طريقة يمكن أن تنتج نفس النتيجة. 'hi there' + os.linesep مساوية لـ 'hi there\r\n' ، والتي لا تعادل 'hi there\n' .

الأمر بسيط: استخدم \n التي سيتم ترجمتها تلقائيًا إلى os.linesep. ولقد كان بهذه البساطة منذ أول ميناء لبيثون إلى ويندوز.

ليس هناك فائدة من استخدام os.linesep على أنظمة غير Windows ، وينتج نتائج خاطئة على Windows.

لا تستخدم os.linesep!





file-io