Replace karakter

Merhabalar

X dosyasını bozmadan y dosyasına aktarmak istiyorum aktarırken de y dosyasının belirli karakterini b dosyasından aldığım ki yaklaşık 118 farklı karakter ile değiştirmek istiyorum ve farkli bi dosya ya yazdirmak bi turlu yapamadim yardimci olabilecek var mi tesekkurler iyi gunler

aldigim hatalar
AttributeError: ‘_io.TextIOWrapper’ object has no attribute ‘replace’

    with open("b.txt",mode='r') as dat:
        for dic in dat:
            dic=dic.strip()
            for i in data:
                i.replace('sabit degisecek karakter', dic)
                with open("y.txt",mode='w+') as son:
                    son.write(data)

Merhaba,

İlk olarak lütfen kodlarınızı şu gönderiye uygun bir şekilde düzenleyin, yoksa python girintileri önemsediği için kodunuz okunmuyor.

İkinci olarak anladığım kadarıyla

Daki dat, bir string değil, dosyada işlem yapabilmek için kullandığımız tabiri caizse bir handle. for dic in dat.read(): diyerek dosya içindeki metni çekebilirsiniz.

Bu da üstteki ile aynı sorun

Burada for döngüsüne ihtiyacın yok gibi,

content = data.read()
content.replace('your_character', dic)

gibi bir kullanım mümkün. Eğer daha fazla direktif istiyorsanız lütfen daha açıklayıcı olun, amacınızı pek anlamadım.

cevap icin tesekkur ederim

A dosyasinin icerigi
xxx 123 xxx
yyy 123 yyy
fff 123 fff

B dosyasi icerigi

abc
ab43
ba3

yapmak istedigim ise A dosyasinin icerigindeki 123 yerine B dosyasinin icerigini tek tek degistirerek yeni bir C dosyasi olurturmak

C dosyasinin son hali boyle olacak

xxx abc xxx 
yyy ab43 yyy
fff ba3 fff

with open(“b.txt”,mode=‘r’) as dat: okuma kipinde ac dat ata demis olmuyormuyuz ?

A ve B dosyalarının satırlarını paralel olarak işlemek istediğinizden zip kullanabilirsiniz. Şu an yaptığınız for satir in dosya tek bir dosyadaki satırları sırasıyla verirken, aşağıdaki zipleme ile birden fazla dosyanın satırına aynı anda erişirsiniz. Sonrasında A’nın satırındaki istenmeyen elemanı (mesela 123) B’nin satırındaki eleman ile replace edersiniz. Burada B’nin satırına rstrip("\n") ekleyerek sonundaki newline’dan kurtuluyoruz ve öyle değiştirme işlemi yapıyoruz. Bir diğer nokta da değişme işleminin yeni bir string döndürmesidir; onu da yeni_satir değişkeninde karşılıyoruz. Bu işlemi her satır için yaparken yeni satırları yeni_satirlar adlı listede topluyoruz. Sonrasında bunun içeriği writelines ile hedef dosya olan C’ye yazılıyor.

with open("A.txt") as dosya_a, open("B.txt") as dosya_b:
    yeni_satirlar = []
    for satir_a, satir_b in zip(dosya_a, dosya_b):
        yeni_satir = satir_a.replace("123", satir_b.rstrip("\n"))
        yeni_satirlar.append(yeni_satir)

with open("C.txt", "w") as dosya_c:
    dosya_c.writelines(yeni_satirlar)

liste = []
for ...
   liste.append(...)

kalıbı list-comprehensions’ı çağırıyor:

yeni_satirlar = [satir_a.replace("123", satir_b.rstrip("\n"))
                 for satir_a, satir_b in zip(dosya_a, dosya_b)]

Hatta bir adım daha atıp writelines’ın generator kabul edebilmesinden dolayı [ ve ]'ları ( ve ) ile değiştirebilirsiniz.

Evet. Sonrasında yaptığınız for satir in dosya da Pythonik olarak dosyadaki satırları gezme yoludur. read bir çırpıda tüm dosyayı “slurp” eder ve string döndürür; for ile gezerseniz karakter-karakter gezersiniz. Öbür yandan readlines metodu satırlardan oluşan bir liste döndürmesine karşılık yine tüm dosyayı bir anda okumaya yeltenir, hafızaya yük olabilir. Dolayısıyla amacınız dosyayı satır satır gezmek ise for satir in dosya tercih edilirse daha uygun olur; diğerlerini kullanmaya gerek yoktur.

1 Beğeni

aciklama ve yardiminiz icin cok tesekkurler lakin B dosyasi 118 satir ve yeni olusan C dosyasi 118. satirda A dosyasindan okumayi bitiriyor A dosyasi icerigi 2500 line ve icerigi yarim ve eksik replace ediyor // edit ayrica bos bir satir koyarak ilerliyor

Anladım, peki A dosyasındaki geri kalan 2382 satırdaki elemanlar neye göre replace edilmeli? Mesela B dosyasının tekrar başa mı sarmasını bekliyorsunuz?

ayrica bos bir satir koyarak ilerliyor gormemissinizdir diye buraya ekledim hayir

usteki ornekten ornek vereyim

A dosyasi icerigi

xxx 123 xxx
usteki line degisecek 
yyy 123 yyy
alt taki line degisecek
fff 123 fff
bu sekilde degistirmek istedigim yer 2 yada daha fayla line arasinda 

hayir a dosyasinda 118 tane 123 var ve ben b dosyasinda 118 tane
farkli karakteri tek tek ki karakterler farkli 123 ile degistirmek istiyorum

Bunu bir örnekle gösterebilir misiniz tam anlayamadım, denediğimde eklemiyordu…

xxx 123 xxx
usteki line degisecek
yyy 123 yyy
alt taki line degisecek
fff 123 fff

ciktida olan

xxx 123 xxx

usteki line degisecek

yyy 123 yyy

alt taki line degisecek

fff 123 fff

suan bende de sorun gozukmuyor belkide beynim yandi :slight_smile:

O zaman A dosyasının tüm satırlarını gezeriz; eğer satırda “123” varsa B’den yeni bir satır isteriz readline ile ve değiştiririz:

# yine iki dosyayı açıyoruz
with open("A.txt") as dosya_a, open("B.txt") as dosya_b:
    # yeni dosya olan C.txt'ye yazılacak olan satırları tutar
    yeni_satirlar = []
    # A'daki her satır için...
    for satir_a in dosya_a:
        # değiştirilesi eleman satırda var mı?
        if "123" in satir_a:
            # öyleyse B'den bir satır okuyup değiştiririz
            satir_b = dosya_b.readline().rstrip("\n")
            yeni_satir = satir_a.replace("123", satir_b)
        else:
            # değilse A'daki satır olduğu gibi devam eder
            yeni_satir = satir_a
        # yeni satırı kenarda tutuyoruz
        yeni_satirlar.append(yeni_satir)

# C dosyasına yazıyoruz
with open("C.txt", "w") as dosya_c:
    dosya_c.writelines(yeni_satirlar)

Bu da list-comprehension ile yazılabilir ama okunabilirliği düşer büyük ihtimalle…

1 Beğeni

gardas ne diyim gunu kurtardin peki ek olarak 2. bir B dosyasi daha eklesek cok sey istemis olmam dimi :upside_down_face: yeni b dosyasida 118 karakterli ki zaten dosya adini degistirip c dosyasi uzerinden devam ededebilirim cok saol tekrardan

Çok şey olur evet o da size kalmış :ğ Bence yaparsınız üsttekileri bir şekilde modifiye ederek; olmazsa tekrar sorsanız daha iyi olur nasıl denediğinizi de paylaşarak (kodu ile).

1 Beğeni

affiniza siginaraktan diyim beyin yandi cunku

Buradaki data değişkeni nereden geliyor? Kendisine değer atanan bir yer göremiyorum.

dedigim gibi beyin yandigi icin :slight_smile:

kod edit sirasinda (````) ile ayni line oldugundan cikmamis

with open("out.txt",mode='r') as data:
    with open("b.txt",mode='r') as dat:
        for dic in dat:
            dic=dic.strip()
            for i in data:
                i.replace('sabit degisecek karakter', dic)
                with open("y.txt",mode='w+') as son:
                    son.write(data)

Estağfurullah burası benim tekelimde değil zaten :ğ. Ama anlayamadım sorunu çözdünüz mü, çözemediyseniz nasıl bir kod yazdınız da olmadı

vermisoldugunuz kod ile hallettim ama 2. bi dosyayi ekleyemedim 2. 1 for dongusu ile denedim yapamadim 2. bi kosul ekledim olmadi dunku gibi olmayayim diye saldim cok sagolun vermis oldugunuz kod da isimi goruyor