मुझे कई ASCII फाइलों के cellsize, xllcorner और yllcorner को m से km में बदलने की जरूरत है। मैं उन्हें एएससीआईआई फाइलों के शीर्षलेख में ओवरराइट करने की कोशिश कर रहा हूं जैसे कि मैं नियमित टेक्स्ट फ़ाइल के साथ, इस तरह:

for rw_file in os.listdir(r"C:\Users\Marie\Test"):
    rw_file_path = os.path.join(r"C:\Users\Marie\Test", rw_file)
    with open(rw_file_path, 'r+') as f:
        # skip the first two lines of the header
        f.readline()
        f.readline()
        # convert the values of cellsize, xllcorner and yllcorner into km
        line3 = f.readline()
        header_x, xllcorner = line3.split()
        xllcorner_new = int(xllcorner) / 1000
        f.seek(2)
        f.write(re.sub(header_x, xllcorner_new)) #third argument??
        line4 = f.readline()
        header_y, yllcorner = line4.split()
        yllcorner_new = int(yllcorner) / 1000
        f.seek(3)
        f.write(re.sub(header_y, yllcorner_new))
        line5 = f.readline()
        header_size, cellsize = line5.split()
        cellsize_new = int(cellsize) / 1000
        f.seek(4)
        f.write(re.sub(header_size, cellsize_new))

लेकिन निश्चित रूप से समारोह re.sub को तीन तर्कों की आवश्यकता है। मुझे यकीन नहीं है कि यह और कैसे करें। मैं अभी भी एक नौसिखिया हूं इसलिए मुझे यकीन है कि एक आसान तरीका है, लेकिन मुझे यह नहीं मिल रहा है। क्या मैं इन पंक्तियों को हेडर में किसी भी तरह से ओवरराइट कर सकता हूं, या कोई और तरीका है?

-1
technicallysam 22 जिंदा 2020, 19:46

1 उत्तर

सबसे बढ़िया उत्तर

पुरानी फ़ाइल को जगह में बदलने के बजाय आपको एक नई फ़ाइल में लिखना चाहिए (और फिर उस नई फ़ाइल को पुरानी फ़ाइल पर कॉपी कर सकते हैं)। चूंकि आप फ़ाइल में जो नए मान लिख रहे हैं, वे पुराने की तुलना में बाइट्स में एक अलग आकार के हैं, इसे जगह में बदलने से कचरा सामग्री उत्पन्न होगी।

जहां तक ​​re.sub के बारे में आपके विशिष्ट प्रश्न का संबंध है, आप इसके दस्तावेज़ यहां देख सकते हैं: https://docs.python.org/3/library/re.html#re.sub। इसके लिए स्ट्रिंग को इसके तीसरे पैरामीटर के रूप में बदलने की आवश्यकता है।

0
Rörd 22 जिंदा 2020, 16:55