[Çözüldü] Satır silme işlemleri?

Başlatan marslı, 17 Haziran 2017 - 17:45:12

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

marslı

MErhaba arkadaşlar.
Python ile bir dosyanın içindeki 2-3 satırı silmek istiyorum. Nasıl yapabilirim? Rica etsem bir kod örneği gönderir misiniz?  ::)

Amenofis

Dosyanın sadece sonuna ekleme yapılabilir. Bunun dışında araya ekleme ya da çıkarma yapılamaz.

Çözüm önce dosyayı belleğe al, sonra istemediğin satırları hariç tutarak başka bir dosyaya yaz.

Platin

BAŞINA ORTASINA SONUNA EKLEME YAPILIR DETAYLI BİLGİ İÇİN OKUYUNUZ
25.6.2 Dosyaların Basında Degisiklik Yapmak
Bir önceki bölümde dosya sonuna nasıl yeni satır ekleyecegimizi ögrendik. Ama siz
programcılık maceranız sırasında muhtemelen dosyaların sonuna degil de, en basına ekleme
yapmanız gereken durumlarla da karsılasacaksınız. Python'da bu isi yapmak da çok kolaydır.
Örnek olması açısından, 1hrist.txt adlı dosyanın içerigini ele alalım:
Ahmet Özbudak : 0533 123 23 34
Mehmet Sülün : 0532 212 22 22
Sami Sam : 0542 333 34 34
Selin Özden : 0212 222 22 22
Dosya içerigi bu. Eger bu dosyayı "a" kipi ile açtıktan sonra dogrudan write() metodunu
kullanarak bir ekleme yaparsak, yeni deger dosyanın sonuna eklenecektir. Ama biz mesela su
veriyi:
Sedat Köz : 0322 234 45 45
'Ahmet Özbudak : 0533 123 23 34' girdisinin hemen üstüne, yani dosyanın sonuna degil de
en basına eklemek istersek ne yapacagız?
Öncelikle su kodları deneyelim:
with open("fihrist.txt", "r") as f:
veri = f.read()
f.seek(0) #Dosyayı başa sarıyoruz
f.write("Sedat Köz\t: 0322 234 45 45\n"+veri)
Bu kodları bir dosyaya kaydedip çalıstırdıgımızda Python bize su hatayı verecektir:
istihza@netbook:~/Desktop$ python3 deneme.py
Traceback (most recent call last):
File "deneme.py", line 4, in <module>
f.write("Sedat Köz\t: 0322 234 45 45\n"+veri)
io.UnsupportedOperation: not writable
Bu hatayı almamızın sebebi dosyayı 'okuma' kipinde açmıs olmamız. Çünkü bir dosyayı
okuma kipinde açtıgımızda o dosya üzerinde yalnızca okuma islemleri yapabiliriz. Dosyaya
yeni veri ekleme kısmına gelindiginde, dosya yalnızca okuma yetkisine sahip oldugu için,
Python bize yukarıdaki hata mesajını verecek, dosyanın 'yazılamaz' oldugundan sikayet
edecektir.
Peki dosyayı "w" karakteri yardımıyla yazma kipinde açarsak ne olur? O zaman da su mes'um
hatayı alırız:
istihza@netbook:~/Desktop$ python3 deneme.py
Traceback (most recent call last):
File "deneme.py", line 2, in <module>
veri = f.read()
io.UnsupportedOperation: not readable
Gördügünüz gibi, bu kez de dosyanın okunamadıgına iliskin bir hata alıyoruz. Çünkü biz bu
kez de dosyayı 'yazma' kipinde açtık. Ancak burada söyle bir durum var. Bildiginiz gibi, bir
dosyayı "w" kipi ile açtıgımızda, Python bize hiçbir sey sormadan varolan içerigi silecektir.
Burada da yukarıda yazdıgımız kodlar yüzünden dosya içerigini kaybettik. Unutmayın, dosya
okuma-yazma islemleri belli bir takım riskleri içinde barındırır. O yüzden bu tür islemleri
yaparken fazladan dikkat göstermeliyiz.
Yukarıda da gördügümüz gibi, dosyamızı "r" veya "w" kiplerinde açmak ise yaramadı. Peki ne
yapacagız? Bunun cevabı çok basit: Dosyamızı hem okuma hem de yazma kipinde açacagız.
Bunun için de farklı bir kip kullanacagız. Dikkatlice bakın:
with open("fihrist.txt", "r+") as f:
veri = f.read()
f.seek(0) #Dosyayı başa sarıyoruz
f.write("Sedat Köz\t: 0322 234 45 45\n"+veri)
Burada "r+" adlı yeni bir kip kullandıgımıza dikkat edin. "+" isareti bir dosyayı hem okuma
hem de yazma kipinde açmamıza yardımcı olur. Iste bu isareti "r" kipiyle birlikte "r+" seklinde
kullanarak dosyamızı hem okuma hem de yazma kipinde açmayı basardık. Artık ilgili dosya
üzerinde hem okuma hem de yazma islemlerini aynı anda gerçeklestirebiliriz.
Yukarıdaki kodlarda ilk satırın ardından söyle bir kod yazdık:
veri = f.read()
Böylece dosyanın bütün içerigini veri adlı bir degiskene atamıs olduk. Peki bu islemi
yapmazsak ne olur? Yani mesela söyle bir kod yazarsak:
with open("fihrist.txt", "r+") as f:
f.seek(0)
f.write("Sedat Köz\t: 0322 234 45 45\n")
Bu sekilde 'Sedat Köz\t: 0322 234 45 45\n' satırı, dosyadaki ilk satırı silip onun yerine
geçecektir. Çünkü f.seek(0) ile dosyanın basına dönüp o noktaya, yani dosyanın ilk satırına
bir veri ekledikten sonra Python öbür satırları otomatik olarak bir alt satıra kaydırmaz. Bunun
yerine ilk satırdaki verileri silip onun yerine, yeni eklenen satırı getirir. Eger yapmak istediginiz
sey buysa ne âlâ. Bu kodları kullanabilirsiniz. Ama bizim istedigimiz sey bu degil. O yüzden
veri = f.read() satırını kullanarak dosya içerigini bir degisken içinde depoluyoruz ve böylece
bu verileri kaybetmemis oluyoruz.
Bu satırın ardından gelen f.seek(0) satırının ne ise yaradıgını biliyorsunuz. Biz yeni veriyi
dosyanın en basına eklemek istedigimiz için, dogal olarak bu kod yardımıyla dosyanın en
basına sarıyoruz. Böylece su kod:
f.write("Sedat Köz\t: 0322 234 45 45\n"+veri)
Sedat Köz\t: 0322 234 45 45\n' satırını dosyanın en basına ekliyor. Ayrıca burada, biraz önce
veri degiskenine atadıgımız dosya içerigini de yeni ekledigimiz satırın hemen arkasına ilave
ettigimize dikkat edin. Eger bunu yapmazsanız, elinizde sadece Sedat Köz'ün iletisim bilgilerini
barındıran bir dosya olacaktır...
25.6.3 Dosyaların Ortasında Degisiklik Yapmak
Gördügünüz gibi, Python'da bir dosyanın en sonuna ve en basına veri eklemek çok zor degil.
Birkaç satır yardımıyla bu islemleri rahatlıkla yapabiliyoruz. Peki ya bir dosyanın en basına
veya en sonuna degil de rastgele bir yerine ekleme yapmak istersek ne olacak?
Hatırlarsanız, Python'da her veri tipinin farklı özellikleri oldugundan, her veri tipinin farklı
açılardan birbirlerine karsı üstünlükleri ya da zayı2ıkları oldugundan söz etmistik. Dedigimiz
gibi, Python'da bazı isler için bazı veri tiplerini kullanmak daha pratik ve avantajlı olabilir.
Örnegin karakter dizileri degistirilemeyen veri tipleri oldugu için, mesela bir metinde
degisiklik yapmamız gereken durumlarda, eger mümkünse listeleri kullanmak daha mantıklı
olabilir. Zira bildiginiz gibi, karakter dizilerinin aksine listeler degistirilebilir veri tipleridir.
Önceki sayfalarda bir dosyayı okurken üç farklı metottan yararlanabilecegimizi ögrenmistik.
Bu metotların read(), readline() ve readlines() adlı metotlar oldugunu biliyorsunuz. Bu
üç metottan read() adlı olanı bize çıktı olarak bir karakter dizisi veriyor. readline() metodu
ise dosyaları satır satır okuyor ve bize yine bir karakter dizisi veriyor. Sonuncu metot olan
readlines() ise bize bir liste veriyor. readline() metodundan farklı olarak readlines()
metodu dosyanın tamamını bir çırpıda okuyor.
Bu üç metot arasından, adı readlines() olanının, dosyaların herhangi bir yerinde degisiklik
yapmak konusunda bize yardımcı olabilecegini tahmin etmis olabilirsiniz. Çünkü dedigimiz
gibi readlines() metodu bize bir dosyanın içerigini liste halinde veriyor. Bildiginiz gibi
listeler, üzerinde degisiklik yapılabilen veri tipleridir. Listelerin bu özelliginden yararlanarak,
dosyaların herhangi bir yerinde yapmak istedigimiz degisiklikleri rahatlıkla yapabiliriz. Simdi
dikkatlice bakın su kodlara:
with open("fihrist.txt", "r+") as f:
veri = f.readlines()
veri.insert(2, "Sedat Köz\t: 0322 234 45 45\n")
f.seek(0)
f.writelines(veri)
Bu kodları bir dosyaya kaydedip çalıstırdıysanız, istedigimiz islemi basarıyla yerine getirdigini
görmüssünüzdür. Peki ama bu kodlar nasıl çalısıyor?
Yukarıdaki kodlarda dikkatimizi çeken pek çok özellik var. Ilk olarak gözümüze çarpan
sey, dosyayı "r+" kipinde açmıs olmamız. Bu sekilde dosyayı hem okuma hem de yazma
kipinde açmıs oluyoruz. Çünkü dosyada aynı anda hem okuma hem de yazma islemleri
gerçeklestirecegiz.
Daha sonra söyle bir satır yazdık:
veri = f.readlines()
Bu sayede dosyadaki bütün verileri bir liste olarak almıs olduk. Liste adlı veri tipi ile ne
yapabiliyorsak, bu sekilde aldıgımız dosya içerigi üzerinde de aynı seyleri yapabiliriz. Bizim
amacımız bu listenin 2. sırasına yeni bir satır eklemek. Bu islemi listelerin insert() adlı
metodu yardımıyla rahatlıkla yapabiliriz:
veri.insert(2, "Sedat Köz\t: 0322 234 45 45\n")
Bu sekilde liste üzerinde istedigimiz degisiklikleri yaptıktan sonra tekrar dosyanın basına
dönmemiz lazım. Çünkü readlines() metoduyla dosyayı bir kez tam olarak okuduktan sonra
imleç o anda dosyanın en sonunda bulunuyor. Eger dosyanın en basına dönmeden herhangi
bir yazma islemi gerçeklestirirsek, yazılan veriler dosyanın sonuna eklenecektir. Bizim
yapmamız gereken sey dosyanın en basına sarıp, degistirilmis verilerin dosyaya yazılmasını
saglamak olmalı. Bunu da su satır yardımıyla yapıyoruz:
f.seek(0)
Son olarak da bütün veirleri dosyaya yazıyoruz:
f.writelines(veri)
Simdiye kadar dosyaya yazma islemleri için write() adlı bir metottan yararlanmıstık. Burada
ise writelines() adlı baska bir metot görüyoruz. Peki bu iki metot arasındaki fark nedir?
write() metodu bir dosyaya yalnızca karakter dizilerini yazabilir. Bu metot yardımıyla
dosyaya liste tipinde herhangi bir veri yazamazsınız. Eger mutlaka write() metodunu
kullanmak isterseniz, liste üzerinde bir for döngüsü kurmanız gerekir. O zaman yukarıdaki
kodları söyle yazmanız gerekir:
with open("fihrist.txt", "r+") as f:
veri = f.readlines()
veri.insert(2, "Sedat Köz\t: 0322 234 45 45\n")
f.seek(0)
for öğe in veri:
f.write(öğe)
writelines() adlı metot ise bize dosyaya liste tipinde verileri yazma imkanı verir. Dolayısıyla
herhangi bir döngü kurmak zorunda kalmadan listeleri dosyalarımıza yazabiliriz.
Böylece Python'da dosyaların herhangi bir yerine nasıl yazabilecegimizi ögrenmis olduk. Bu
arada eger isteseydik yukarıdaki kodları söyle de yazabilirdik:
with open("fihrist.txt", "r") as f:
veri = f.readlines()
with open("fihrist.txt", "w") as f:
veri.insert(2, "Sedat Köz\t: 0322 234 45 45\n")
f.writelines(veri)
Bir önceki kodlardan farklı olarak bu kodlarda dosyamızı önce okuma kipinde açıp verileri
veri adlı bir degisken içinde sakladık. Ardından aynı dosyayı bir kez de yazma kipinde açarak,
gerekli degisiklikleri liste üzerinde gerçeklestirdikten sonra bütün verileri dosyaya yazdık.
Unutmayın, Python'da herhangi bir islemi pek çok farklı sekilde gerçeklestirebilirsiniz. Biz
yukarıda olası yöntemlerden bazılarını ele aldık. Zaten bütün yöntemleri tek tek göstermemiz
pek mümkün olmazdı. Siz dosyalara iliskin bilgilerinizi ve farklı araçları kullanarak aynı
islemleri çok daha farklı sekillerde de yapabilirsiniz. Yani karsı karsıya oldugunuz duruma
degerlendirip, yukarıdaki kodlardan uygun olanını veya kendi buldugunuz bambaska bir
yöntemi kullanabilirsiniz.
Bu arada, aslında yukarıdaki kodlarda uyguladıgımız yöntem biraz güvensiz. Çünkü aynı
dosyayı hem okuyup hem de bu dosyaya yeni veri ekliyoruz. Eger bu islemlerin herhangi
bir asamasında bir hata olusursa, bütün degisiklikleri dosyaya isleyemeden dosya içerigini
tümden kaybedebiliriz. Bu tür risklere karsı en uygun çözüm, okuma ve yazma islemlerini ayrı
dosyalar üzerinde gerçeklestirmektir. Bunun nasıl yapılacagından biraz sonra söz edecegiz.
Biz simdi baska bir konuya deginelim.

marslı

@Amenofis söylediğin biçimde for döngüsüyle zorlanarakta olsa yaptım. Şu anda çalışıyor :) Teşekkürler.

@Platin kardeş keşke daha erken yazsaydın be :) Yaptıktan sonra foruma girdim baktım uzun uzun yazmışsın :) o kadr ingilizce çevirmeye uğraştım. Teşekkür ederim gene de yazıkların için

Ama bir yerde daha tıkandım :) Şöyle sorayım. Bir dosyamız olsun. dosyamızın içinde kelimenin hangi satırda olduğunu bilmeyelim. Kelimeyi bulup kelimenin olduğu satırı komple silmek istesem nasıl yapabilirim? Yada içinde XXX geçen tüm kelimeleri silmek istesem? :/ 

Platin

Bende müşteri  bilgileri içerenbir program yazıyorum büyük ihtimalle yarın bitiririm ve benımkinden örnek vererek açıklarım @marslı kardeş :) ::)

marslı

Niye bitince? :o İki satır kod için beni mi bekleyeceksin @Platin çok ayıp ettin vallaha :D 

Amenofis

Benim hobi olarak geliştirdiğim proje üzerine bırak türkçeyi ingilizce bile kaynak yoktu. Tek satır kod yazmadan 1 sene araştırma yaptım.  Sana tavsiyem hiçbir zaman hazır kod isteme. Çünkü ne kadar araştırarak, ne kadar zorlanarak yaparsan algoritma kurma yeteneğin o kadar gelişir ve öğrendiklerin aklında kalır. Hazır kod ile bugün yaptığın şeyi yarın unutursun. 

Sorduğun 2. soru hakkında da şöyle söyleyeyim. Dosya üzerinde değişiklik yapmayı unut, yok öyle bişey. Ne yapıyorsan stringler üzerinde yap ve sıfırdan dosyaya yaz.

' kelime ' satırda mevcutsa -> atla
değilse satırı yeni dosyaya yaz.

Bu kadar basit.

marslı

Evet haklısın @Amenofis ama ingilizcem olmadığı için sormak durumunda kalıyorum. for döngüsüyle falan baya uğraşıp açıp yazmaya uğraştım. Ama şu soruya ne kaynak bulabildim nede çözüm. 
Alıntı YapKelimeyi bulup kelimenin olduğu satırı komple silmek istesem..
Hani bash olsa * ekleyip geçiyosun. Pythonda bu yok bu yüzden sordum. Bir de ben örnekler üzerinde daha iyi öğrendiğimi düşünüyorum. Haa bak bu şunu yapmış bu buna yaramış gibi. Örnek kod istememim sebebi de budur :) 

szgnblt

Marslı merhaba.
Forumda dikkat ettiğim senin genelde Python ile dosya okuma yazma işlemlerinin olduğu. Naçizane tavsiyem olacak. Dosyalar ile uğraşmaktansa sqlite CRUD işlemleri senin işini fazlası ile görecektir. Ayrıca Sqlite 4gb kadar desteklediğini hatırlıyorum. İşyerinde kullandığım mssql ile 4 yıllık şirket verilerimizin dosya boyutu 400mb. 

marslı

@szgnblt öneri için teşekkürederim. Ben conf dosyalarını düzenlemek için betik yapmaya çalışıyorum. Bahsettiğin sqlite veritabanı ile ilgili yanılmıyorsam. 

szgnblt

Evet sqlite veritabanı ile ilgili. Python syntax'ın basit olması dilinde basit olacağı anlamına gelmiyor. Django ile web programa ile ticari uygulamalar geliştirilebilinir. Kivy modülü ilede Windows linux android iOS için görsel temelli uygulamalarda geliştirilebilinir. Dosya okuma yazma basit kaldığı için Python'da dosya okuma yazma yerine daha kompleks uygulamalar geliştirilmesi hepimizin işini fazlası ile görecektir. Betik yapmak için bash scripti neden tercih etmediğini anlamadım :) ufkumu açarsan sevinirim.

marslı

Ya bu betik script gibi şeylerin adlarını bir çözemedim :)  Python ile kendimi geliştirmeye çalışıyorum.  Dedim ki hem biraz daha kendimi ilerleteyim hemde değişiklik yapmak istediğim conf dosyalarını düzenleyen bir script yada betik işte her neyse onu yazayım dedim. Ama altından kalkamadım. Sonra düşündüm. Tüm satırı silmek yerine yeni dosyada o satır hariç tüm satırları yeni dosyaya yazayım. Ama yine olmadı. Lanet ingilizcesizlik böyle bişey. Takıldığım yerde çözemeyince tüm satırları çöpe atıp yeni limanlara yelken açıyorum. yeni limana yol alacağım gibi duruyor 

Bash olayına gelince bash kesmiyor beni yahu :D  

szgnblt

@Amenofis in bahsettiği gibi string search yapsan sonra eşitlik sorgulama yapsan eşitlik yok ise yeni string bassan işine yaramıyormu. Yapmaya çalıştığın dosyayı ve değişikliği çok merak ettim. Mümkünse dosya içeriğini ve kodlarını ayrı ayrı paylaşırmısın. Belki bir fikir verebiliriz veya fikir edinebiliriz.

edge35

[mention=627615]@marslı[/mention]
Python bilmiyorum fakat o satır dışındakileri yazmak için bir yol haritası söyleyeyim. (C de bu şekilde)
1- Varolan dosyayı okuma modunda aç
Yazma modunda yeni dosya oluştur

2- dosya sonuna kadar her satırı oku, işlemleri her satırı okurken yap
İf(satır silinecek satır ise) -> bir şey yapma
Else -> satırı yeni dosyaya yaz

3- eski dosyayı sil
Yeni dosyanın ismini eski dosya yap

4- dosyaları kapat


C de temel olarak böyle yapılabiliyor. Python için farklar olabilir ama ne demek istediğimi anlamışsındır. Zaten işlem 2. maddede yapılıyor.
while(dosya sonuna kadsr döndür)
{
Satırı oku
İf(satır silinecek ise) {bir_şey_yapma}
Else {satırı_yeni_dosyaya_yaz}
}

Umarım anlatabilmişimdir


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

marslı

@edge35 Ben de python'da aynen öyle yaptım. Tek sıkıntım satırın devamı tamamlanması.dosya1 = open("dns.conf","r")
lines = dosya1.readlines()
dosya2 = open("dns2.conf","w")
for line in lines:
  if line!="True"+"False":
   f.write(line)
Burada sıkıntı yok. True'yi False olarak değiştirdik.
Peki True ile başlayanların tüm satırların (devamını bilmiyoruz herşey olabilir) değişmesini istersek? İşte burada tıkandım. Bash dilinde ki "*" herşey dahil karakterinin yerine kullanacağım kodu arıyorum. 

edge35

[mention=627628]@marslı[/mention] python bilmediğim için verdiğiniz kodu yarım yamalak anlayabildim, anlayamadım yani  :P

C üzerinden size bir kod paylaşayım.
// yorum satırı için "//" kullanılır, kendinden sonra gelen karakterleri kodda çalıştırmaz.

#include <stdio.h> //kütüphaneler eklenir
#include <string.h>

int main()
{
FILE *dg_conf_dosyasi ,*dg_gecici_dosya; //dosya tipinde değişken oluşturulur
dg_conf_dosyasi = fopen("conf_dosyasi","r"); //eski dosya okuma modunda açılır
dg_gecici_dosya = fopen("gecici_dosya","w"); //geçici dosya yazma modunda oluşturulur

char satir[200]; //200 karakterlik satir adında değişken oluşturulur, satirlari okumak için

while(!feof(dg_conf_dosyasi)) //dosya sonuna kadar döngü devam eder
{
fscanf(dg_conf_dosyasi ,"%s" ,satir); //satir okunur

if(strstr(satir ,"ax") != NULL) //eğer satır içerisinde "ax" yani istenilen metin varsa
{
//eğer silmek istiyorsak if içerisini boş bırakırız

//eğer yerine başka bir şey yazmak istiyorsak aşağıdaki satır iş görür
fprintf(dg_gecici_dosya ,"Yazmak istediğimiz metin\n");
}

else //aranılan metin yoksa
{
fprintf(dg_gecici_dosya ,"%s\n" ,satir ); //silinmeyecek olan satır geçici dosyaya yazılır
}
}

remove("conf_dosyasi"); //Eski dosya silinir
rename("gecici_dosya","conf_dosyasi"); //geçici dosyanın ismi eski dosyanın ismi ile değiştirilir

fclose(dg_conf_dosyasi); //dosyalar kapatılır
fclose(dg_gecici_dosya);

return 0;
}


Eski dosya
1as56ff
2gasax6445asfa
3asf565
4ax64zc
5g5jn5
6ags588
7s5v
8aax
9sa2f
10v


Yeni dosya
1as56ff
Yazmak istediğimiz metin
3asf565
Yazmak istediğimiz metin
5g5jn5
6ags588
7s5v
Yazmak istediğimiz metin
9sa2f
10v
10v


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

marslı

Sorun yok bende C bilmiyorum :) Benim yaptığımı sende C ile yapmışsın ama asıl nokta satırın devamını silmek ;) Kelime değiştirebiliyorum yukarıdaki kod ile

edge35

#17
Ben komple satır ile işlem yapıyorsunuz sanmıştım. Satırı okuduktan sonra yine ilgili satır üstünde değişiklik yapıp yazabilirsiniz. Mesela "="den sonrasını silmek ve ya değiştirmek istiyorsanız string'i ='i referans alarak bölebilir, yeni bir string ile birleştirebilir ve ya aynı bırakabilirsiniz. Pythonda bu işlemi hangi fonksiyon yapar, onu bilemiyorum. Kısa bir google araması ile bulunabilir diye tahmin ediyorum. Pythonda string bölme fonksiyonu...


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 22 Haziran 2017 - 19:03:46

Linkte işinize yarayabilecek fonksiyonlar var.
https://yazilimsevdasi.com/python-ile-string-islemleri/


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

Amenofis

[mention=627635]@marslı[/mention]

Ben de python öğrenmeye çalıştığım için konuya ilgiliyim de şurada ne yapmak istediğini merak ettim doğrusu.

if line!="True"+"False":

Bunun anlamı line stringi "TrueFalse" e eşit değilse:
demek. Bence yanlış bişeyler yapıyorsun. String içinde geçen 'True' sözcüğünü 'False' e çevirmek için replace metodunu kullanacaksın.
line = line.replace('True', 'False')

Bir satır içinde herhangi bir karakter grubunun olup olmadığını test etmek için "in" operatörünü kullanabilirsin. Mesela satırda 'False' olup olmadığına bakmak için;

if 'False' in line:
...

Satırı kelimelere bölmek için split metodu var.  Mesela line = "Bu bir cümledir!" dersek;
liste = line.split()
['Bu', 'bir', 'cümledir!']
listesini verir. liste[0] ilk kelimedir.

szgnblt


import os
import sys
import fileinput

print ("Text to search for:")
textToSearch = input( "> " )

print ("Text to replace it with:")
textToReplace = input( "> " )

print ("File to perform Search-Replace on:")
fileToSearch  = input( "> " )
#fileToSearch = 'D:\dummy1.txt'

tempFile = open( fileToSearch, 'r+' )

for line in fileinput.input( fileToSearch ):
    if textToSearch in line :
        print('Match Found')
    else:
        print('Match Not Found!!')
    tempFile.write( line.replace( textToSearch, textToReplace ) )
tempFile.close()


input( '\n\n Press Enter to exit...' )


Denermisin. Ayrıca config dosyasından birkaç satır örnek yazarmısın.

marslı

Alıntı YapBunun anlamı line stringi "TrueFalse" e eşit değilse:demek. Bence yanlış bişeyler yapıyorsun. String içinde geçen 'True' sözcüğünü 'False' e çevirmek için replace metodunu kullanacaksın.line = line.replace('True', 'False')
Evet bende ilk kodları gördüğümde anlam veremedim ama True'yi false olarak değiştir işlemini yapıyor. replace ile yaptığımda 
Alıntı Yapdosya1 = open("dns.conf","r")lines = dosya1.readlines()dosya2 = open("dns2.conf","w")for line in lines:  if line!="True"+"False":   f.write(line)
kodlarına uyumlu olmuyor. 
@szgnblt string hatası aldım. 
Alıntı YapTraceback (most recent call last):  File "./in.py", line 18, in <module>    tempFile = open( fileToSearch, 'r+' )TypeError: coercing to Unicode: need string or buffer, bool found
Yalnız pek istediğim şeyi yapmıyor gibi kodlar :) 

szgnblt

Python3 olarak bende hata vermedi. Eski satırı komple yazıp komple Yeni satır yapabiliyorum

marslı

Pardon @szgnblt python2 ile çalıştığım için python2 ile çalıştırdım. o yüzden hata verdi sanırım. Python3 ile çalıştırınca değiştiriyor ama istediğim yine olmadı. 

Şöyle olsun. Ubuntu 14.04 , Ubuntu 15.04 ve Ubuntu 16.04 olsun dosyamızın satırlarıda. Ben komutu çalıştırınca Ubuntu ile başlayan tüm satırlar yeni dosyaya yazılmasın. Bunu ypamk istiyorum.

semm

#23
istediğin karakterlik bir yeri bu şekilde okuyup başka bir dosyaya yazabilirsin
dosya = open('dosya1.txt','r')
f1 = int(input('kaç karakterlik yeri okumak istiyorsun: '))
oku = dosya.read(f1)
# 'a+' hem okuma hem yazma yetkisi
# dosya yoksa açar ,dosya varsa içi doluysa silmez append işlemi yapar.
with open('yeniDosya1.txt','a+') as f1:
   f1.write(str(oku))
   print('yeni dosyaya yazıldı')
print('okunan yer : ',oku)




Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 28 Haziran 2017 - 21:26:15

[mention=627954]@marslı[/mention] sana çözüm ararken baya pratik yaptım ve en son istediğin bir satırı okuyan fonksiyon,jeneratör yazdım.

def fonk(dosya,satır):
a = (j for i,j in enumerate(dosya) if i in satır)
print(*[i for i in a])
with open('dosya1.txt','r') as f :
_input = int(input('kaçıncı satır:\n> '))
fonk(f,[_input])


marslı

@semm ilk kodun örneğinde yeni dosyaya karakteri yazıyor. İkincisin de ise satırı okuyor . değişiklik yapmıyor. Aslında Python'da bashın karşığı olan "*" herşey karşığılını bulsam sorun çözülecek. O da sanırım yok