2008-11-29 16 views
5

मेरी फ़ाइल की अंतिम पंक्ति है:मैं फ़ाइल की अंतिम पंक्ति को कैसे संशोधित करूं?

29-dez, 40,

मुझे लगता है कि लाइन कैसे सुधार सकते हैं ताकि इसे पढ़ता है:

29-Dez, 40 , 90,100,50

नोट: मैं एक नई लाइन नहीं लिखना चाहता हूं। मैं एक ही लाइन लेना चाहता हूं और 29-Dez,40,

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

+0

यह कठिन है क्योंकि यह कठिन है। आप जो कर रहे हैं वह चर-लंबाई वाली रेखाओं वाली टेक्स्ट फ़ाइलों के लिए वास्तव में समझदार नहीं है। –

+0

इस प्रश्न के अनुवर्ती की तरह दिखने के लिए http://stackoverflow.com/questions/328059/create-a-list-that-contain-each-line-of-a-file देखें। –

+0

मैंने आपके प्रश्न को काफी हद तक संशोधित किया है, अगर मुझे कुछ गलत समझा गया है तो मुझे बताएं। एस लॉट भी सही है, हालांकि ऐसा लगता है कि यह सरल होना चाहिए, फ़ाइल को संशोधित करना वास्तव में काफी मुश्किल है। –

उत्तर

0

फ़ाइलों के साथ सीधे काम न करें, एक डेटा संरचना बनाएं जो आपकी आवश्यकताओं को कक्षा के रूप में फिट करे और फ़ाइल विधियों से पढ़ने/लिखने के लिए तैयार करे।

4

जब तक फ़ाइल बहुत बड़ी न हो, तो आपको शायद पूरी फ़ाइल को डेटा संरचना (जो केवल लाइनों की सूची हो) में पढ़ना आसान हो जाएगा, और फिर स्मृति में डेटा संरचना को संशोधित करें, और अंततः इसे लिखें फ़ाइल पर वापस।

दूसरी ओर शायद आपकी फ़ाइल वास्तव में बहुत बड़ी है - कम से कम कई जीबी। इस मामले में: आखिरी पंक्ति शायद एक नए रेखा चरित्र के साथ समाप्त हो जाती है, यदि आप उस स्थिति की तलाश करते हैं तो आप इसे अंतिम पंक्ति के अंत में नए पाठ के साथ ओवरराइट कर सकते हैं।

तो शायद:

f = open("foo.file", "wb") 
f.seek(-len(os.linesep), os.SEEK_END) 
f.write("new text at end of last line" + os.linesep) 
f.close() 

(विभिन्न प्लेटफार्मों पर Modulo लाइन अंत)

+0

पायथन 3.2 और ऊपर के लिए, आप केवल एक फ़ाइल (टेक्स्ट फ़ाइल) की शुरुआत से ही तलाश ऑपरेशन कर सकते हैं। – derek

2

आदेश एक डेटा संरचना में फ़ाइल की सामग्री को पढ़ने के लिए आप की readlines() method उपयोग कर सकते हैं में क्या Doug said पर विस्तार करने के लिए, फ़ाइल ऑब्जेक्ट।

नीचे कोड नमूना, "लाइनों" की एक सूची में फ़ाइल पढ़ता अंतिम पंक्ति को संपादित करता है, तो यह वापस लिखता फाइल करने के लिए बाहर:

#!/usr/bin/python 

MYFILE="file.txt" 

# read the file into a list of lines 
lines = open(MYFILE, 'r').readlines() 

# now edit the last line of the list of lines 
new_last_line = (lines[-1].rstrip() + ",90,100,50") 
lines[-1] = new_last_line 

# now write the modified list back out to the file 
open(MYFILE, 'w').writelines(lines) 

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

0

मैंने हाल ही में कुछ ऐसा करने के लिए एक स्क्रिप्ट लिखी है। यह एक परियोजना को पार करेगा, सभी मॉड्यूल निर्भरताओं को ढूंढ देगा और किसी भी गायब आयात विवरण जोड़ देगा। मैं इस पोस्ट को पूरी लिपि के साथ अव्यवस्थित नहीं करूंगा, लेकिन मैं दिखाऊंगा कि मैं अपनी फाइलों को संशोधित करने के बारे में कैसे गया।

import os 
from mmap import mmap 

def insert_import(filename, text): 
    if len(text) < 1: 
     return 
    f = open(filename, 'r+') 
    m = mmap(f.fileno(), os.path.getsize(filename)) 
    origSize = m.size() 
    m.resize(origSize + len(text)) 
    pos = 0 
    while True: 
     l = m.readline() 
     if l.startswith(('import', 'from')): 
      continue 
     else: 
      pos = m.tell() - len(l) 
      break 
    m[pos+len(text):] = m[pos:origSize] 
    m[pos:pos+len(text)] = text 
    m.close() 
    f.close() 

सारांश: यह स्निपेट एक फ़ाइल नाम और टेक्स्ट का एक ब्लॉब डालने के लिए लेता है। यह पहले से मौजूद अंतिम आयात विवरण पाता है, और उस स्थान पर टेक्स्ट चिपकता है।

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

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