2012-03-28 17 views
11

मैं एक समस्या में भाग रहा हूं कि मैंने किसी को स्टैक ओवरव्लो मुठभेड़ या यहां तक ​​कि उस मामले के लिए Google को नहीं देखा है।पायथन पूरी पाठ फ़ाइल नहीं पढ़ता

मेरा मुख्य लक्ष्य फ़ाइल में एक स्ट्रिंग के किसी अन्य स्ट्रिंग के अवसरों को प्रतिस्थापित करने में सक्षम होना है। फ़ाइल में सभी लाइनों को स्वीकार करने में सक्षम होने का कोई तरीका है।

समस्या यह है कि जब मैं टेक्स्ट की एक बड़ी टेक्स्ट फ़ाइल (1-2 जीबी) में पढ़ने की कोशिश करता हूं, तो पाइथन केवल इसके सबसेट को पढ़ता है।

newfile = open("newfile.txt","w") 
f = open("filename.txt","r") 
for line in f: 
    replaced = line.replace("string1", "string2") 
    newfile.write(replaced) 

और यह केवल मूल फ़ाइल की पहली 382 एमबी लिखते हैं:

उदाहरण के लिए, मैं वास्तव में एक बस के रूप में कमान करेंगे। क्या किसी ने पहले इस समस्या का सामना किया है?

मैं ऐसे का उपयोग कर के रूप में कुछ अलग करने की कोशिश की समाधान:

import fileinput 
for i, line in enumerate(fileinput.input("filename.txt", inplace=1) 
    sys.stdout.write(line.replace("string1", "string2") 

लेकिन यह एक ही प्रभाव पड़ता है। और न ही इस तरह के

मैं ज्यादातर संभावना समस्या में एक पढ़ने और नहीं एक लिखित समस्या जा रहा है क्योंकि यह बस लाइनों बाहर मुद्रण के लिए होता है के लिए नीचे संकुचित किया है का उपयोग कर के रूप में मात्रा में फ़ाइल को पढ़ने नहीं करता है। मुझे पता है कि और लाइनें हैं। जब मैं इसे एक पूर्ण पाठ संपादक में खोलता हूं जैसे कि विम, मैं देख सकता हूं कि आखिरी पंक्ति क्या होनी चाहिए, और यह अंतिम रेखा नहीं है जो पायथन प्रिंट करता है।

क्या कोई भी कोशिश करने के लिए कोई सलाह या चीजें पेश कर सकता है?

मैं वर्तमान में राम की 3.25 GB के साथ Windows XP के 32-बिट संस्करण का उपयोग कर रहा है, और अजगर 2.7

चल * समाधान संपादित मिला (धन्यवाद Lattyware)। एक इटरेटर

def read_in_chunks(file, chunk_size=1000): 
    while True: 
     data = file.read(chunk_size) 
     if not data: break 
     yield data 
+1

एक पुनरावर्तक के साथ लाइन द्वारा पढ़ना लाइन आलसी ऑपरेशन होना चाहिए, इसलिए इसे फ़ाइल के आकार के बावजूद काम करना चाहिए। हालांकि यह आपकी स्थिति को प्रभावित नहीं करेगा, आप फ़ाइलों को खोलते समय '' '' 'का उपयोग करना भी चाहेंगे - यह अपवादों के तहत सही तरीके से बंद होने की तुलना में एक अच्छा अभ्यास है। –

+0

यह बहुत अच्छा काम किया! बहुत बहुत धन्यवाद। * संपादित करें: मैंने इटरेटर कोड को यहां पोस्ट करने का प्रयास किया, लेकिन यह प्रारूपित नहीं होगा, इसलिए मैंने इसे मूल पोस्ट में जोड़ा। – user1297872

+0

क्या आपने इसे एक अलग बड़ी टेक्स्ट फ़ाइल के साथ करने की कोशिश की है? फ़ाइल 382 एमबी में कुछ अजीब बात है - कुछ अजीब चरित्र जिसे फाइल के अंत के रूप में माना जा रहा है? मेरे पास – neil

उत्तर

1

का उपयोग करके आप इस तरह फ़ाइल का उपयोग करते हैं:

with open("filename.txt") as f: 
    for line in f: 
     newfile.write(line.replace("string1", "string2")) 

यह एक बार में केवल स्मृति में एक पंक्ति पढ़ना चाहिए, जब तक कि आप स्मृति में है कि लाइन के लिए एक संदर्भ रहते हैं।
प्रत्येक पंक्ति को पढ़ने के बाद यह छुटकारा पाने के लिए कचरा कलेक्टर तक होगा। इस आज़मा कर देखें और देखें कि क्या यह काम करता है आप :)

22

कोशिश के लिए:

f = open("filename.txt", "rb") 

Windows पर, rb द्विआधारी मोड में फ़ाइल खोलने का मतलब है। दस्तावेज़ों के अनुसार, टेक्स्ट मोड बनाम द्विआधारी मोड का केवल अंत-रेखा-रेखा वर्णों पर प्रभाव पड़ता है। लेकिन (अगर मुझे सही याद है) मुझे विश्वास है कि विंडोज़ पर टेक्स्ट मोड में फाइलें खोलना भी ईओएफ (हेक्स 1 ए) के साथ कुछ करता है।

तुम भी मोड जब fileinput का उपयोग कर निर्दिष्ट कर सकते हैं:

fileinput.input("filename.txt", inplace=1, mode="rb") 
+0

यह भी काम करता है! मुझे वह समाधान सबसे ज्यादा पसंद है, क्योंकि मौजूदा कोड को बदलना कितना आसान है। – user1297872

+0

कैसे "यह भी काम करता है"? यह स्पष्ट रूप से आपकी समस्या है। अन्य दृष्टिकोण ने भी काम किया? आह, मैं टिप्पणियों में देखता हूं, पढ़ने के लिए एक बाइट-लेंस निर्दिष्ट करता हूं, "रीडलाइन" – jsbueno

+0

का उपयोग करने के बजाय, – Stoyan

2

क्या आप वाकई समस्या पढ़ने के साथ है और लिखने के साथ नहीं हैं? क्या आप फ़ाइल को बंद कर देते हैं, या तो स्पष्ट रूप से newfile.close() या with निर्माण का उपयोग कर रहे हैं?

आउटपुट फ़ाइल को बंद नहीं करना अक्सर ऐसी समस्याओं का स्रोत होता है जब बफरिंग कहीं भी चल रही है। यदि आपकी सेटिंग में भी यही मामला है, तो बंद करने से आपके प्रारंभिक समाधान ठीक हो जाएंगे।

संबंधित मुद्दे