اذهب إلى المحتوى
  • 0

البحث عن سطر معين في ملف وتبديله باستخدام بايثون

Fahmy Mostafa

السؤال

أريد أن أقوم بتبديل عدد من الأسطر في ملف نصي عادي، لذلك أقوم بقراءة كل الملف (قد تحدث مشاكل إن كان الملف كبير للغاية)، وبعد ذلك أقوم بالبحث عن السطر المطلوب وتبديله، لكن المشكلة هي بمجرد إيجاد السطر المطلوب تبديله لا أعلم كيفية حذف السطر الخاص به والكتابة مكانه، هل توجد طريقة للكتابة في مكان معين في ملف نصي بدلًا من كتابة كامل محتوى الملف مرة أخرى؟

هذا هو الكود الخاص بي:

f = open(file)
for line in f:
    if line.contains('foo'):
        newline = line.replace('foo', 'bar')
        # كيفية كتابة هذا السطر الجديد مرة أخرى إلى الملف

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يدعم fileinput بالفعل التحرير الداخلي. و يقوم بإعادة توجيه stdout إلى الملف في هذه الحالة يُمكنك إستخدامه بهذا الشكل:

import fileinput

with fileinput.FileInput("file.txt", inplace=True) as file:
    for line in file:
        print(line.replace("foo", "bar"), end='')

لاحظ أننا حددنا المعامل inplace ب True حتى نستطيع التعديل.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك إستخدام الكود الآتي للحصول على المطلوب ، حيث يقوم هذا الكود بكتابة المحتوى الى ملف جديد وتبديل الملف القديم بالملف الجديد

from tempfile import mkstemp
from shutil import move, copymode
from os import fdopen, remove

def replace(file_path, pattern, subst):
    #إنشاء ملف مؤقت
    fh, abs_path = mkstemp()
    with fdopen(fh,'w') as new_file:
        with open(file_path) as old_file:
            for line in old_file:
                new_file.write(line.replace(pattern, subst))
    #نسخ الصلاحيات من الملف القديم الى الملف الجديد
    copymode(file_path, abs_path)
    # حذف الملف الأصلي
    remove(file_path)
    # تحريك الملف الجديد
    move(abs_path, file_path)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

سأعرف لك تابع عام يقوم باستبدال نص بنص آخر، ٍسأتخدم االمكتبة regex هنا:

import re
search_text="2 hi there"
new_text="hi"
def replaceText(path, oldtext, newtext, flags=0 ):
    with open( path, "r+" ) as f:
        content = f.read()
        pa = re.compile( re.escape( oldtext ), flags )
        content = pa.sub( newtext, content )
        f.seek( 0 )
        f.truncate()
        f.write( content )
# قبل الاستبدال
path="D:\\ff.txt"
f = open(path, "r")
print(f.read()) 
'''
1 hi there
2 hi there
3 hi there
'''
replaceText(path,search_text,new_text)
# بعد الاستبدال
f = open(path, "r")
print(f.read()) 
'''
1 hi there
hi
3 hi there
'''

يمكنك أيضاً استخدام الوحدة fileinput التي تحوي على توابع تسمح بتسريع التعامل مع هذه الأمور:

import fileinput
search_text="2 hi there"
new_text="hi"
def replaceText(path, oldtext, newtext):
    with fileinput.input(path, inplace=1) as file:
        for line in file:
            new = line.replace(oldtext, newtext)
            print(new, end='')
# قبل الاستبدال
path="D:\\ff.txt"
f = open(path, "r")
print(f.read()) 
'''
1 hi there
2 hi there
3 hi there
'''
f.close()
replace_in_file(path,search_text,new_text)
# بعد الاستبدال
f = open(path, "r")
print(f.read()) 
'''
1 hi there
hi
3 hi there
'''

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك البحث عن سطر معين في ملف و إستبداله بإستخدام البرنامج أدناه:

import fileinput import sys
  def replaceAll(file,searchExp,replaceExp): 
    for line in fileinput.input(file, inplace=1):
       if searchExp in line: 
         line = line.replace(searchExp,replaceExp) 
         sys.stdout.write(line)
replaceAll("/fooBar.txt","foo","bar")         

كما يمكن أيضاً الكتابة في ملف جديد بعد إستبدال السطر كما هو موضح في البرنامج التالي:

fin = open("foo.txt", "rt")
fout = open("bar.txt", "wt")
for line in fin:
	fout.write(line.replace('foo', 'bar'))
fin.close()
fout.close()

أو بالكتابة في نفس الملف بعد قراءة المحتويات في شكل string و فتح الملف مرة أخرى للكتابة:

fin = open("foo.txt", "rt")
data = fin.read()
data = data.replace('foo', 'bar')
fin.close()
fin = open("foo.txt", "wt")
fin.write(data)
fin.close()

 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...