Text dosyası içerisinde belirli kısımları alma ve yeni bir dosyaya yazdırmak

Merhaba Arkadaşlar,

Öncelikle belirtmeliyim Python bilgim çok fazla değil giriş seviyesinin de altındayım diyebilirim. iş hayatımda yaşadığım ve beni perişan eden bir durumda sizlerden yardım almak istiyorum. Sorunum şu aslında ve ben bu işe saatlerimi harcıyorum diyebilirim.

Elimde şu şekilde satırlar içeren 4-6-810(zamanla değişiyor) milyon satırlık bir text dosyası var.
12318hd282828dwh28238ry2h328328h32838283:a:mrt256:abc0cz

Bunlar normal olarak text dosyası içerisinde alt alta olacak şekilde ve tüm düzeni aynı… başka bir karakter yok sadece son kısımda bulunan abc0cz yazan yer değişken.

Öncelikle benim büyük boyutlu bu dosya içerisinden ilk başta yer alan 40 karakterlik bölümü temiz bir text dosyasına yazdırmak istiyorum. yani elimdeki veri.txt dosyasını python scripte klasör içerisinde gösterip yeniveri.txt olarak bu bölümü yine alt alta almak istiyorum.

12318hd282828dwh28238ry2h328328h32838283
23rf234ree3rfdw23rfdww234refew33refdssss

Gibi…

yine belki aynı script üzerinde olur veya başka bir script de olabilir. son kısımda kalan yani abc0cz bölümünde olan yeri yeni bir text dosyası içerisine almak istiyorum ancak bu kısım 1 karakterden 500 karaktere kadar değişebiliyor bunu sanırım belirtmeliyim.

abc0cz
ghjrll3nhhh43434
1
fj3ı4rjk43rıo439494399430fjdkdjjj222

gibi. yine elimdeki ham veri.txt dosyasını scripte okutup, çıktı olarak yeniveri.txt de bu son kısımda yer alan bölümü alt alta gelecek şekilde almak istiyorum.


Normalde nasıl yapıyorum. split komutu dosyaları bölüyorum, excel ile text dosyasını excelin açabileceği 1milyonluk boyutlara ayarlıyorum, önce 1. kısımda yer alan 40 karakterli yeri kopyala yapıştır yapıyorum, sonra hücreleri ayırma yaparak son kısımda yeri kopyala yapıştır yapıp listeyi temizlemeye çalışıyorum. en son dosyaları komutla birleştiriyorum. 1-2gb lik dosyalar çok önemli değil ama 8-10-15 gb dosya olduğu zaman kafamın üzerinden ateş çıkıyor :slight_smile:

github ve benzeri sitelerde mevcut kodları çok karıştırdım unix kod formlarını denedim ama istediğim gibi bir sonuç malesef olmadı. zaten program yazmak ihtiyaç dahilinde oluşturulduğu için benimkisi gibi bir ihtiyacın olacağını hiç düşünmedim. :slight_smile:

Umarım yardımcı olursunuz. şimdiden çok teşekkür ederim.

Merhaba, bu kısmı aşağıdaki kodlarla halledebiliyor musunuz?

def f(dosya):
    with open(dosya, "r", encoding="utf-8") as read:
        with open("yeni1.txt", "w", encoding="utf-8") as write:
            for i in read.readlines():
                write.write(f"{i[:40]}\n")
                write.flush()

Şu kısım için de aşağıdaki kodlar işinize yarar mı?

def f(dosya):
    with open(dosya, "r", encoding="utf-8") as read:
        with open("yeni2.txt", "w", encoding="utf-8") as write:
            for i in read.readlines():
                write.write(f"{i.split(':')[-1]}\n")
                write.flush()
3 Beğeni

ilginize ve yardımınıza çok teşekkür ederim ancak verdiğiniz kodları 1.py, 2.py olarak kayıt ettim ve 1. kod içerisinde yer aldığı gibi ana listemi yeni.txt olarak yazdım. terminal üzerinden python 1.py yazdığımda sadece alt satıra geçti ve herhangi bir işlem olmadı. konu başında bahsetmiştim python bilgim sadece açıp kullanacak ve modül kurabilecek kadar. bu nedenle verdiğiniz kodları çalıştıramadım (muhtemeldir benim hatam kusuruma bakmayın) birde script içerisinde çıktı alabileceğim bir dosya göremedim. yani yeni.txt okuttuk ama çıktı olarak temizveri.txt gibi bir şey istiyorum çünkü ana dosyanın zarar görmemesi de önemli. kusuruma bakmayın tekrar.

Sanırım fonksiyonu çağırmadığınız için hiç bir işlem yapılmadı. O zaman aşağıdaki kodları bir çalıştırın isterseniz.

def f(dosya):
    with open(dosya, "r", encoding="utf-8") as read:
        with open("yeni1.txt", "w", encoding="utf-8") as write:
            for i in read.readlines():
                write.write(f"{i[:40]}\n")
                write.flush()


f("Buraya dosya ismini yazın.")
# Örn:
# f("a.txt")
# Yalnız a.txt ile bu çalıştırdığınız script dosyası aynı
# dizinde olmalı aksi halde dosyanın tam yolunu
# yazmalısınız.

Diğer kodu da şöyle değiştirin:

def f(dosya):
    with open(dosya, "r", encoding="utf-8") as read:
        with open("yeni2.txt", "w", encoding="utf-8") as write:
            for i in read.readlines():
                write.write(f"{i.split(':')[-1]}\n")
                write.flush()


f("buraya dosya ismini yazın.")
4 Beğeni

Öncelikle çok ama çok teşekkür ederim. 1. script çok güzel çalışıyor 1gb lik dosyayı çok kısa sürede ayırdı bile (bunun için inanılmaz mutlu oldum) 2. script aynı şekilde güzel çalışıyor ama yeni2.txt dosyasına yazarken 1 satır boşluk bırakıyor. yani

123456
7891011

olması gerekirken.

123456

7891011 yapıyor.

Buna da şükür yani çok zor olacaksa eğer bu şekilde kullanıp bir editör yardımı ile boşlukları silebilirim. ne diyebilirim bilmiyorum şu saatte bile hala işle uğraşıyordum çok ama çok teşekkür ederim size :slight_smile:

Bir satır boşluğu \n kaçış dizisi kullanıldığı için koyuyor. Kaçış dizisini silin tekrar deneyin isterseniz.

def f(dosya):
    with open(dosya, "r", encoding="utf-8") as read:
        with open("yeni.txt", "w", encoding="utf-8") as write:
            for i in read.readlines():
                write.write(f"{i.split(':')[-1]}")
                write.flush()


f("dosya ismi")
3 Beğeni

şimdi oldu. editörlerde /n boşluk atmak için demek aynı işlev burada da var. size çok ama çok teşekkür ederim. hep mutlu olun.

@moderatör arkadaşlar kusuruma bakmasın eminim böyle bir konu açmam uygunsuz kaçmıştır ama gerçekten çok çaresizdim.

1 Beğeni

Yok ne kusuru, takıldığınız yerde sorularınızı sorun, yardımcı olmaya çalışırız. İyi çalışmalar.

2 Beğeni
12:38:42 0 aib@vivaldi:/tmp% cat a.txt
12318hd282828dwh28238ry2h328328h32838283:a:mrt256:abc0cz1
22318hd282828dwh28238ry2h328328h32838283:a:mrt256:abc0cz2
32318hd282828dwh28238ry2h328328h32838283:a:mrt256:abc0cz3

12:38:48 0 aib@vivaldi:/tmp% cut -d':' -f1 < a.txt
12318hd282828dwh28238ry2h328328h32838283
22318hd282828dwh28238ry2h328328h32838283
32318hd282828dwh28238ry2h328328h32838283

12:38:50 0 aib@vivaldi:/tmp% cut -d':' -f4 < a.txt
abc0cz1
abc0cz2
abc0cz3
2 Beğeni