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)
İ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.
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.
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
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…
gardas ne diyim gunu kurtardin peki ek olarak 2. bir B dosyasi daha eklesek cok sey istemis olmam dimi 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).
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)
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