दिलचस्प पोस्ट
ऑपरेटर पूर्वता ('==' की तुलना में बिटवर्थ 'और' कम) प्रोग्रामात्मक रूप से एक एंड्रॉइड सूचीदृश्य में एक विशिष्ट स्थान पर स्क्रॉल करें एंड्रॉइड पर ओके एचटीपीपी का इस्तेमाल करते हुए कुकी हैंडलिंग कैसे कार्यान्वित करें? फ्लास्क अनुरोध में प्राप्त आंकड़े कैसे प्राप्त करें PHP में फ़ाइल एक्सटेंशन कैसे प्राप्त करें? C ++ में क्लास के सदस्यों को संदर्भित करने के लिए मैं डॉट, एरो, या डबल कॉलन का उपयोग कब करता हूं? IE JavaScript त्रुटि पार्सिंग त्रुटि प्रविष्टि स्टेटमेंट के लिए पोस्टग्रेज़ में यूयूआईडी उत्पन्न करना? क्या लैम्ब्डा फ़ंक्शंस / अभिव्यक्तियों के साथ समर्थित है? Php का उपयोग करते हुए json पोस्ट भेजें कैसे पर्यावरण क्रॉन अनुकरण के साथ एक स्क्रिप्ट कार्यान्वित? यूनिक्स सॉर्ट कमांड एक बहुत बड़ी फ़ाइल कैसे तय कर सकता है? Zlib का उपयोग करते हुए एक .zip फ़ाइल खोलने का आसान तरीका <form action = "/ sampleServlet" मुझे अपवाद दे रहा है जावास्क्रिप्ट विंडो का आकार बदलना घटना

बड़ी पाठ फ़ाइलों को पायथन में पढ़ो, लाइन में लाइन में बिना इसे स्मृति में लोड किए बिना

मुझे एक बड़ी फाइल पढ़ने की जरूरत है, रेखा से लाइन कहें कि फ़ाइल में 5 जीबी से अधिक है और मुझे प्रत्येक पंक्ति को पढ़ने की आवश्यकता है, लेकिन जाहिर है मैं readlines() का उपयोग नहीं करना चाहता क्योंकि यह मेमोरी में बहुत बड़ी सूची बनाएगा readlines()

इस मामले के लिए नीचे दिए गए कोड कैसे काम करेगा? क्या xreadlines खुद मेमोरी में एक-एक पढ़ रहे हैं? जनरेटर अभिव्यक्ति की जरूरत है?

 f = (line for line in open("log.txt").xreadlines()) # how much is loaded in memory? f.next() 

इसके अलावा, मैं इसे रिवर्स ऑर्डर में पढ़ने के लिए क्या कर सकता हूं, जैसे कि Linux tail कमांड?

मुझे मिला:

http://code.google.com/p/pytailer/

तथा

" अजगर सिर, पूंछ और पिछड़े एक पाठ फ़ाइल की तर्ज से पढ़ा "

दोनों बहुत अच्छी तरह से काम किया!

वेब के समाधान से एकत्रित समाधान "बड़ी पाठ फ़ाइलों को पायथन में पढ़ो, लाइन में लाइन में बिना इसे स्मृति में लोड किए बिना"

मैंने यह जवाब दिया क्योंकि किथ, जबकि संक्षिप्त, फ़ाइल स्पष्ट रूप से बंद नहीं करता है

 with open("log.txt") as infile: for line in infile: do_something_with(line) 

आपको केवल एक वस्तु के रूप में फ़ाइल ऑब्जेक्ट का उपयोग करना है।

 for line in open("log.txt"): do_something_with(line) 

हाल के पायथन संस्करणों में भी बेहतर प्रसंग प्रबंधक का उपयोग कर रहा है।

 with open("log.txt") as fileobject: for line in fileobject: do_something_with(line) 

यह स्वतः ही फ़ाइल को बंद कर देगा।

एक पुराने स्कूल दृष्टिकोण:

 fh = open(file_name, 'rt') line = fh.readline() while line: # do stuff with line line = fh.readline() fh.close() 

आप इसके बजाय एक इटरेटर का उपयोग कर बेहतर हैं प्रासंगिक: http://docs.python.org/library/fileinput.html

डॉक्स से:

 import fileinput for line in fileinput.input("filename"): process(line) 

यह पूरी फाइल को एक बार में मेमोरी में कॉपी करने से बचेंगी।

मैं विश्वास नहीं कर सकता था कि यह जितना आसान हो उतना आसान होगा जितना @ जॉन-ला-रोय के उत्तर ने ऐसा प्रतीत किया। इसलिए, मैंने cp कमांड को लाइन रीड रीड और लिखित करके लाइन के जरिए बनाया। यह पागल फास्ट है

 #!/usr/bin/env python3.6 import sys with open(sys.argv[2], 'w') as outfile: with open(sys.argv[1]) as infile: for line in infile: outfile.write(line) 

इस बारे में कैसा है? अपनी फ़ाइल को विखंडों में विभाजित करें और फिर इसे पंक्ति के अनुसार पढ़ें, क्योंकि जब आप कोई फाइल पढ़ते हैं, तो आपका ऑपरेटिंग सिस्टम अगली पंक्ति को कैश करेगा यदि आप लाइन द्वारा फ़ाइल लाइन पढ़ रहे हैं, तो आप कैश्ड की जानकारी का कुशल उपयोग नहीं कर रहे हैं।

इसके बजाय, फ़ाइल को विखंडों में विभाजित करें और पूरे खंड को मेमोरी में लोड करें और फिर आपकी प्रोसेसिंग करें।

 def chunks(file,size=1024): while 1: startat=fh.tell() print startat #file's object current position from the start fh.seek(size,1) #offset from current postion -->1 data=fh.readline() yield startat,fh.tell()-startat #doesnt store whole list in memory if not data: break if os.path.isfile(fname): try: fh=open(fname,'rb') except IOError as e: #file --> permission denied print "I/O error({0}): {1}".format(e.errno, e.strerror) except Exception as e1: #handle other exceptions such as attribute errors print "Unexpected error: {0}".format(e1) for ele in chunks(fh): fh.seek(ele[0])#startat data=fh.read(ele[1])#endat print data 
 f=open('filename','r').read() f1=f.split('\n') for i in range (len(f1)): do_something_with(f1[i]) 

उम्मीद है की यह मदद करेगा।