Farklı iki txt dosyasının kombinasyonu

Arkadaşlar merhaba
forumda ve pythonda henüz yeniyim
sizin yardımınıza ihtiyacım var

elimde iki tane elinizden öper txt(notepad) dosyası var :slight_smile:
1.txt = [‘9331101114’, ‘9331101116’, ‘9331101117’, …] tabi orjinal dosyada 1. milyona yakın
2.txt = [‘120110’, ‘120111’, ‘120112’, …] tabi bu orjinal dosyada 1. milyona yakın

almak istediğim sonuç

3.txt = [‘9331101114120110’, ‘9331101114120111’, ‘9331101114120112’, ‘9331101116120110’, ‘9331101116120111’, ‘9331101116120112’, ‘9331101117120110’, ‘9331101117120111’, ‘9331101117120112’ vs vs]

1.txt ve 2. txt dosyalarındaki bilgileri 3. bir txt dosyasına yazdırmak ama 1.txt başa 2.txt sona gelecek yani sıralı ve bitişik

Ama liste uzun olduğu(milyonlarca dize) için pythona liste olarak kopyalayıp yapılmıyor bellek yetmiyor
ancak dosyadan dosyaya olabilir

f1 = open(“D:\1.txt”, “r”)
f2 = open(“D:\2.txt”, “r”)
f3 = open(“D:\3.txt”, “w”)
yazı=[(x,y)for x in f1 for y in f2]
print(yazı,file=f3)
dosya.close()

yaptığımda çıkan sonuç bu

[‘9331101114’, ‘9331101116’, ‘9331101117’ …, ‘120110’, ‘120111’, ‘120112’…]

ama benim almak istediğim sonuç

3.txt = [‘9331101114120110’, ‘9331101114120111’, ‘9331101114120112’, ‘9331101116120110’, ‘9331101116120111’, ‘9331101116120112’, ‘9331101117120110’, ‘9331101117120111’, ‘9331101117120112’ vs vs]

Bunun için zip() kullanabilirsiniz.

Örnek vereyim,

a = ["1", "2", "3"]
b = ["9", "8", "7"]

c = [(x + y) for x, y in zip(a, b)]

print(c)

['19', '28', '37']
2 Beğeni

cevabınız için teşekkür ederim
ama yine olmadı ne yazıkki

a ve b python ekranında yazılı dosya değil
iki farklı txt dosyası
ve pythonın onu açıp içindekileri işlemesi gerekiyor

yazdığınız komutu txt için yazınca yine sonuç
[(‘9331101114’, ‘9331101116’, ‘9331101117’ …,) ‘120110’, ‘120111’, ‘120112’…]

böyle oldu

Merhaba, iki dosyanın satırlarını iç içe iki döngü kullanarak elde etmeniz ve ilgili satırları birleştirmeniz gerekiyor diye anladım. Ya iki tane for yazarsınız, ya da itertools.product:

from itertools import product

# ilk ikisi girdi dosyaları, üçüncüsü çıktının yazılacağı dosya
dosya_1 = open("dosya_1.txt")
dosya_2 = open("dosya_2.txt")
dosya_3 = open("dosya_3.txt", "w")

with dosya_1, dosya_2, dosya_3:
    #  dosya 1 ve 2'deki satırların tüm kartezyen çarpımları için...
	for satir_1, satir_2 in product(dosya_1, dosya_2):
        # sonlarındaki olası \n'yi atıp birleştirip en son da \n ekleriz
        # ve yeni dosyaya yazarız
	    dosya_3.write(satir_1.rstrip("\n") + satir_2.rstrip("\n") + "\n")

product'sız alternatif çözüm şöyledir:

with dosya_1, dosya_2, dosya_3:
    #  dosya 1 ve 2'deki satırların tüm kartezyen çarpımları için...
    satirlar_2 = dosya_2.readlines()
	for satir_1 in dosya_1:
        for satir_2 in satirlar_2:
            # sonlarındaki olası \n'yi atıp birleştirip en son da \n ekleriz
            # ve yeni dosyaya yazarız
	        dosya_3.write(satir_1.rstrip("\n") + satir_2.rstrip("\n") + "\n")

Dikkat ederseniz product olmadan, iç içe direkt iki döngü kullandığımızda en azından ikinci dosyanın satırlarını kenarda tutmamız gerekiyor. Çünkü for ile dosyanın üzerinden bir kere geçtiğinizde artık dosyanın sonuna gelmiş oluyorsunuz ve o safhadan sonraki isteklerde dosya geriye StopIteration döndürüyor ve içerideki döngünün içerisine girilmiyor, bir şey yazılmıyor. Sizdeki kodda da bu form var, ondan çalışmamış olsa gerek. product aslında iki dosyanın da satırlarını evvela tümüyle kenara alıyor ve bununla açık olarak uğraşmamış oluyoruz. Dolayısıyla hafıza açısından bu ikinci kod daha iyi olabilir (çünkü ilk dosyanın tüm satırları hafızada tutulmuyor burada) ama hafıza çok sorun değilse ilk kod daha kısa ve okunabilir durabilir, size kalmış.

İç içe iki for kullanmamızın sebebi, ilk dosyadaki her elemana ikinci dosyadaki her elemanın eklenecek olması.

2 Beğeni

Özellikle python ile mi yapmak istiyorsun?

Basit bir konsol komutu yeterken.

copy /b file.0 + file.1 + file.2 newfile

Sırf python kodu yazmış olmak istersen

import os
os.system('copy /b file.0 + file.1 + file.2 newfile')

How do I concatenate text files in Python? - Stack Overflow

2 Beğeni

Cevabınız için teşekkür ederim
ama ne yazık sonuç yine olmadı

[‘9331101114’, ‘9331101116’, ‘9331101117’ , ‘120110’, ‘120111’, ‘120112’…]

Dosyalar bir satırdan mı ibaret?

Dosyaları arka arkaya eklemekten farklı bir niyet var soruda, çapraz çarpım gibi.

hayır binlerce satırdan ibaret

Şu kodun çıktısı nedir, ilk 5 satırı görmek adına:

from itertools import islice

with open("dosya_1.txt") as fh:
    print([*islice(fh, 5)])

ve aynısı dosya_2.txt için de size zahmet.

1 Beğeni

Cevabınız için teşekkür ederim
ama ne yazık ki buda olmadı

yapmak istediğimiz
örneğin masaüstünde 3ad notepad txt dosyası açın
1.txt içine [‘a’, ‘b, ‘c’,‘d’ …] yazın
2.txt içine [‘1’, ‘2’, ‘3’, …] yazın
3.txt boş kalsın sonuç buna yazılacak

  1. txt yazılması istenen bilgi
    [‘a1’,‘a2’,‘a3’,‘b1’,‘b2’,‘b3’,‘c1’,‘c2’,‘c3’,‘d1’,‘d2’,‘d3’]

sıralama önemli yani 1.txt teki bilgi ilk sırada 2.txt deki bilgi son sırada ve bitişik olması gerekmektedir

Bir şey olmayacak ki, önce dosyayı birleştirdik. Sorun dosyanın birleşmesi değil.

Bir sıralama algoritmasını, artık yeni oluşan dosyada kullanabilirsin.

Sadece liste içinde sıralama algoritmaları kullanılmaz. Dosya üzerinde de kullanabilirsin.

Oluşan tek dosyayı, sıralamak hepsi bu.

:slight_smile:

Şimdi işin rengi değişti.

Birincideki veriyi al, ikincideki veriyi al ve iki satırı birleştir.

Ve iki dosyanın boyutu aynı mı?

Hatta bir iki soru daha gerekir,

Bu verilerden bir satırda kaç tane var, ne ile ayrılmış?

Soru basit ama ne istediğini anlayamıyorum.

Evet iki dosyadaki verileri birleştiririz de, enine boyuna dikine, tam olarak her satırda bir veri mi var biraz detay verir misin?

hayır farklı boyutta

birincide 1 milyon
ikincide 10bin
veri var

normal notepad dosyası olduğu için “elma”,“armut”, vs şeklinde tırnak ve virgülle ayrılmış
ve her satır dolunca otomatik alt satıra kaymış

Şu veri kavramında bir anlaşsak.

Bu veriler metin dosyasında, her satırda bir tane olacak şekilde mi, aralarında bir ayıraç virgül veya boşluk var mı?

Sonuçta al alta 1 milyon verinin yanına 10 bin taneyi yazarzak, geriye kalan, 990.000 verinin yanına ne yazacağız?

Sen ne yapacağını biliyorsun da henüz ben anlayamıyorum.

Yani dosyalar 1 satırdan ibaret oluyor…