Neden write () 'da bir satırsonu için dizge kullanamıyorum ama onu writelines () içinde kullanabilirim?
Fikir şudur: Tek bir dizge yazmak istiyorsanız bunu ile yapabilirsiniz write()
. Bir dizi dizeniz varsa, hepsini kullanarak yazabilirsiniz writelines()
.
write(arg)
bir dizeyi bağımsız değişken olarak bekler ve bunu dosyaya yazar. Bir dizge listesi sağlarsanız, bu bir istisna oluşturur (bu arada, bize hataları gösterin!).
writelines(arg)
argüman olarak yinelenebilir olmasını bekler (yinelenebilir bir nesne, en genel anlamda bir tuple, bir liste, bir dizge veya bir yineleyici olabilir). Yineleyicide bulunan her öğenin bir dizge olması beklenir. Sağladığınız bir dizi dizedir, bu nedenle işler yolunda gitti.
Dizelerin (dizelerin) doğası her iki işlev için de önemli değildir, yani sadece onlara ne sağlarsanız onu dosyaya yazarlar. İlginç writelines()
olan, kendi başına satırsonu karakterleri eklememesidir, bu nedenle yöntem adı aslında oldukça kafa karıştırıcı olabilir. Aslında adı verilen hayali bir yöntem gibi davranır write_all_of_these_strings(sequence)
.
Aşağıdakiler, Python'da her dizeyi kendi satırında tutarken bir dosyaya dize listesi yazmanın deyimsel bir yoludur:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.write('\n'.join(lines))
Bu, dosyayı sizin için kapatmanızı sağlar. Yapı '\n'.join(lines)
, listedeki dizeleri birleştirir (bağlar) ve lines
yapıştırıcı olarak '\ n' karakterini kullanır. +
Operatörü kullanmaktan daha verimlidir .
Aynı lines
diziden başlayarak, aynı çıktıyla biten ancak şunu kullanarak writelines()
:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)
Bu, bir üreteç ifadesini kullanır ve dinamik olarak satırsonu ile sonlandırılmış dizeler oluşturur. writelines()
bu dizgi dizisini yineler ve her öğeyi yazar.
Düzenleme: Dikkat etmeniz gereken başka bir nokta:
write()
ve tanıtılmadan readlines()
önce writelines()
vardı. writelines()
daha sonra bir muadili olarak tanıtıldı readlines()
, böylece sadece okunan dosya içeriğini kolayca yazabilirsin readlines()
:
outfile.writelines(infile.readlines())
Gerçekten, bu kadar writelines
kafa karıştırıcı bir isme sahip olmasının ana nedeni budur . Ayrıca bugün bu yöntemi artık gerçekten kullanmak istemiyoruz. verileri yazmaya readlines()
başlamadan önce tüm dosyayı makinenizin belleğine okur writelines()
. Her şeyden önce bu zaman kaybedebilir. Diğer bölümleri okurken neden verilerin bazı kısımlarını yazmaya başlamıyorsunuz? Ancak en önemlisi, bu yaklaşım çok fazla bellek tüketebilir. Giriş dosyasının makinenizin belleğinden daha büyük olduğu uç bir senaryoda, bu yaklaşım işe yaramayacaktır bile. Bu sorunun çözümü yalnızca yineleyiciler kullanmaktır. Çalışan bir örnek:
with open('inputfile') as infile:
with open('outputfile') as outfile:
for line in infile:
outfile.write(line)
Bu, girdi dosyasını satır satır okur. Bir satır okunduğu anda bu satır çıktı dosyasına yazılır. Şematik olarak konuşulduğunda, bellekte her zaman tek bir satır vardır (okuma satırları / yazma yaklaşımı durumunda tüm dosya içeriğinin bellekte olmasıyla karşılaştırıldığında).
lines
örneğinizde bir dize değil. Altı dizeden oluşan bir demettir.