Python ile bir dosyaya liste yazma


674

Yeni writelines()satır karakterleri eklemediğinden dosyaya liste yazmanın en temiz yolu bu mu?

file.writelines(["%s\n" % item  for item in list])

Standart bir yol var gibi görünüyor ...


37
writelinesyeni satırlar eklemediğini unutmayın, çünkü aynalar readlines, onları da kaldırmaz.
SingleNegationElimination

Yanıtlar:


911

Bir döngü kullanabilirsiniz:

with open('your_file.txt', 'w') as f:
    for item in my_list:
        f.write("%s\n" % item)

Python 2'de şunları da kullanabilirsiniz:

with open('your_file.txt', 'w') as f:
    for item in my_list:
        print >> f, item

Tek bir işlev çağrısına meraklıysanız, en azından köşeli parantezleri kaldırın [], böylece yazdırılacak dizeler birer birer yapılır (listcomp yerine genexp) - tüm belleği almak için bir neden yoktur dizelerin tüm listesini gerçekleştirmek için.


7
Bu çok karmaşık değil, ama neden sadece turşu veya json kullanmıyorsunuz, böylece serileştirme ve serileştirme hakkında endişelenmenize gerek yok?
Jason Baker

82
Örneğin, satır başına bir öğe ile kolayca okunabilen, düzenlenebilen vb. Bir çıktı metin dosyası istediğiniz için. Çok nadir bir arzu ;-).
Alex Martelli

1
İlkinde \ n Python 2.7 / Windows üzerinde gereksiz olduğunu buldum
Jorge Rodriguez

11
Bu sonunda ekstra bir yeni satır karakteri yazacak ... döngü yerine, sadece yazabilirsinizthefile.write('\n'.join(thelist))
Tgsmith61591

3
Şunu eklerdim: "Liste veri tipine dikkat et". Bazı garip sonuçlar alıyordum, belki bu birine yardımcı olabilir:thefile.write(str(item) + "\n")
iipr

383

Dosyayla ne yapacaksın? Bu dosya insanlar veya açık birlikte çalışabilirlik gereksinimleri olan diğer programlar için var mı?

Aynı python uygulaması tarafından daha sonra kullanmak üzere bir listeyi diske serileştirmeye çalışıyorsanız , listeyi turşulamalısınız .

import pickle

with open('outfile', 'wb') as fp:
    pickle.dump(itemlist, fp)

Tekrar okumak için:

with open ('outfile', 'rb') as fp:
    itemlist = pickle.load(fp)

35
+1 - Python'da seri serileştirme olduğunda neden tekerleği yeniden icat ettiniz?
Jason Baker

20
+1 - outfile open( "save.p", "wb" )open( "save.p", "rb" )
şuna

2
Sorun, listenin belleğe sığması gerektiğidir. Durum böyle değilse, satır satır gerçekten olası bir stratejidir (veya stackoverflow.com/questions/7180212/… 'de olduğu gibi başka bir alternatifle devam eder )
Filippo Mazza

1
Python 2'de "ValueError: güvensiz dize turşusu" alırsanız turşu okurken 'rb' yerine 'r' kullanın
15

1
@serafeim: hayır; with:blok , blok dışındaki bir sonraki ifadeye devam etmeden önce dosyayı kapatır with.
SingleNegationElimination

286

Daha basit yol:

with open("outfile", "w") as outfile:
    outfile.write("\n".join(itemlist))

Öğe listesindeki tüm öğelerin bir jeneratör ifadesi kullanarak dizeler olmasını sağlayabilirsiniz:

with open("outfile", "w") as outfile:
    outfile.write("\n".join(str(item) for item in itemlist))

Tüm itemlistlistelerin bellekte olması gerektiğini unutmayın , bu nedenle bellek tüketimine dikkat edin.


23
Sondaki yeni satır yok, döngüye kıyasla 2 kat boşluk kullanıyor.
Dave,

7
Elbette akla ilk gelen soru OP'nin bir satırsonu ile bitmesi gerekip gerekmediği ve alan miktarının önemli olup olmadığıdır. Erken optimizasyonlar hakkında ne söylediklerini biliyorsunuz.
Jason Baker

15
Bir dezavantajı: Bu, herhangi birini yazmadan önce bellekteki dosya için tüm içeriği oluşturur, bu nedenle en yüksek bellek kullanımı yüksek olabilir.
RobM

4
Bunu asla işe yarayamam. Bu hatayı alıyorum: "text = '\ n'.join (namelist) +' \ n 'TypeError: sıra öğesi 0: beklenen dize, liste bulundu"
Dan

2
'Namelist' içindeki tüm öğelerin dize olduğundan emin olmalısınız.
osantana

94

Kullanımı Python 3 ve Python 2.6+ sözdizimi:

with open(filepath, 'w') as file_handler:
    for item in the_list:
        file_handler.write("{}\n".format(item))

Bu platformdan bağımsızdır. Ayrıca, son satırı UNIX en iyi uygulaması olan yeni satır karakteriyle sonlandırır .

Python 3.6 ile başlayarak, "{}\n".format(item)bir f-string: ile değiştirilebilir f"{item}\n".


son öğe için "\ n" eklemek istemiyorum, ne yapmalı? koşul istemiyorsanız
pyd

4
@pyd for loop yerinefile_handler.write("\n".join(str(item) for item in the_list))
orluke

88

Yine başka bir yol. Simplejson ( python 2.6'da json olarak dahil edilmiştir) kullanarak json'a seri numarası :

>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()

Output.txt dosyasını incelerseniz:

[1, 2, 3, 4]

Bu, sözdiziminin pythonic olması, insan tarafından okunabilir olması ve diğer dillerdeki diğer programlar tarafından okunabilmesi nedeniyle yararlıdır.


39

Bir genexp kullanmanın faydalarını keşfetmenin ilginç olacağını düşündüm, işte benim almam.

Sorudaki örnek, geçici bir liste oluşturmak için köşeli parantez kullanır ve bu nedenle aşağıdakine eşdeğerdir:

file.writelines( list( "%s\n" % item for item in list ) )

Gereksiz yere, yazılacak tüm satırların geçici bir listesini oluşturur, bu, listenizin boyutuna ve çıktısının ne kadar ayrıntılı olduğuna bağlı olarak önemli miktarda bellek tüketebilir. str(item) .

(Sarma kaldırılmasıyla aynıdır köşeli parantez Bırak list()yerine geçici geçecek yukarıdaki çağrıyı) jeneratör için file.writelines():

file.writelines( "%s\n" % item for item in list )

Bu jeneratör, itemtalep üzerine nesnelerinizin yeni satır sonlandırılmış temsilini oluşturur (örn. Yazıldığı gibi). Bu birkaç nedenden dolayı güzel:

  • Çok büyük listelerde bile bellek ek yükleri küçüktür
  • Yavaşsa str(item), her öğe işlenirken dosyada görünür ilerleme var

Bu, aşağıdakiler gibi bellek sorunlarını önler:

In [1]: import os

In [2]: f = file(os.devnull, "w")

In [3]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 385 ms per loop

In [4]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.

Traceback (most recent call last):
...
MemoryError

(Bu hatayı Python'un maksimum sanal belleğini ~ 100MB ile sınırlayarak tetikledim. ulimit -v 102400 ).

Bellek kullanımını bir tarafa koyarsak, bu yöntem aslında orijinalinden daha hızlı değildir:

In [4]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 370 ms per loop

In [5]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
1 loops, best of 3: 360 ms per loop

(Linux'ta Python 2.6.2)


20

Çünkü ben tembelim....

import json
a = [1,2,3]
with open('test.txt', 'w') as f:
    f.write(json.dumps(a))

#Now read the file back into a Python list object
with open('test.txt', 'r') as f:
    a = json.loads(f.read())

json serileştirilebilir nelerdir?
kRazzy R

1
Evet, gerçekten!
CommandoScorch

1
ithalat json; test_list = [1,2,3]; list_as_a_string = json.dumps (test_listesi); #list_as_a_string artık '[1,2,3]' dizesidir
CommandoScorch

Bunu yapıyorum with open ('Sp1.txt', 'a') as outfile: json.dump (sp1_segments, outfile) logger.info ("Saved sp_1 segments"); sorun benim program üç kez çalışır ve üç çalışma sonuçları ezilmiş oluyor. her çalışmadan elde edilen sonuçların fark edilebilir olması için 1-2 boş satır eklemenin bir yolu var mı?
kRazzy R

1
Kesinlikle! onun yerine yapabilir json.dump(sp1_segments + "\n\n", outfile)misin
CommandoScorch

19

Listeyi virgülle ayrılmış değerle metin dosyasına seri hale getirme

mylist = dir()
with open('filename.txt','w') as f:
    f.write( ','.join( mylist ) )

14

Genel olarak

Aşağıda writelines () yönteminin sözdizimi verilmiştir.

fileObject.writelines( sequence )

Misal

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "rw+")
seq = ["This is 6th line\n", "This is 7th line"]

# Write sequence of lines at the end of the file.
line = fo.writelines( seq )

# Close opend file
fo.close()

Referans

http://www.tutorialspoint.com/python/file_writelines.htm


13
file.write('\n'.join(list))

1
Bunun, gerçek anlamda platformdan bağımsız olması için dosyanın metin olarak açılmasını gerektireceğini unutmamak gerekir.
Jason Baker

2
fileDeğişkeni nasıl elde edersiniz ?
Jonathan Morales Vélez

8
with open ("test.txt","w")as fp:
   for line in list12:
       fp.write(line+"\n")

7

Ayrıca aşağıdaki gibi python3 kullanıyorsanız yazdırma işlevini de kullanabilirsiniz.

f = open("myfile.txt","wb")
print(mylist, file=f)

myfile.txt dosyasına yalnızca bir satır koymakla kalmaz, her bir satıra a, b, c yazmak yerine ['a', 'b', 'c'] gibi bir şey koymaz.
Harry Duong


2

Bu mantık önce listedeki öğeleri 'e dönüştürecektir string(str). Bazen liste şöyle bir grup içerir

alist = [(i12,tiger), 
(113,lion)]

Bu mantık her bir parçayı yeni bir satıra dosyalamak için yazacaktır. Daha sonra evaldosyayı okurken her bir parçayı yüklerken kullanabiliriz :

outfile = open('outfile.txt', 'w') # open a file in write mode
for item in list_to_persistence:    # iterate over the list items
   outfile.write(str(item) + '\n') # write to the file
outfile.close()   # close the file 

1

Yineleme ve satırsonu eklemenin başka bir yolu:

for item in items:
    filewriter.write(f"{item}" + "\n")

1

Python> 3'te printve *bağımsız değişkenleri açmak için kullanabilirsiniz :

with open("fout.txt", "w") as fout:
    print(*my_list, sep="\n", file=fout)

-2

Bırakın avg liste olsun, o zaman:

In [29]: a = n.array((avg))
In [31]: a.tofile('avgpoints.dat',sep='\n',dtype = '%f')

Gereksiniminize göre %eveya kullanabilirsiniz %s.


-2

In Python3 Bu döngü kullanabilir

with open('your_file.txt', 'w') as f:
    for item in list:
        f.print("", item)

-4
poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
'''
f = open('poem.txt', 'w') # open for 'w'riting
f.write(poem) # write text to file
f.close() # close the file

Nasıl Çalışır: Öncelikle, yerleşik açık işlevini kullanarak ve dosyanın adını ve dosyayı açmak istediğimiz modu belirterek bir dosyayı açın. Mod bir okuma modu ('r'), yazma modu ('w') veya ekleme modu ('a') olabilir. Metin modunda ('t') veya ikili modda ('b') okuyup yazmamayı veya eklememizi de belirleyebiliriz. Aslında daha birçok mod var ve yardım (açık) bunlar hakkında daha fazla ayrıntı verecektir. Varsayılan olarak, open () dosyayı bir 'metin' dosyası olarak kabul eder ve 'ok' modunda açar. Örneğimizde, dosyayı ilk olarak metin yazma modunda açıyoruz ve dosyaya yazmak için dosya nesnesinin yazma yöntemini kullanıyoruz ve ardından dosyayı son olarak kapatıyoruz.

Yukarıdaki örnek Swaroop C H. swaroopch.com'un "Byte of Python" kitabından


5
Bu, OP'nin istediği gibi bir dizeye (dizelerin değil) değil, bir dosyaya bir dize yazar
gwideman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.