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 ...
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 ...
Yanıtlar:
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.
thefile.write('\n'.join(thelist))
thefile.write(str(item) + "\n")
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)
open( "save.p", "wb" )
open( "save.p", "rb" )
with:
blok , blok dışındaki bir sonraki ifadeye devam etmeden önce dosyayı kapatır with
.
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 itemlist
listelerin bellekte olması gerektiğini unutmayın , bu nedenle bellek tüketimine dikkat edin.
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"
.
file_handler.write("\n".join(str(item) for item in the_list))
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.
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, item
talep üzerine nesnelerinizin yeni satır sonlandırılmış temsilini oluşturur (örn. Yazıldığı gibi). Bu birkaç nedenden dolayı güzel:
str(item)
, her öğe işlenirken dosyada görünür ilerleme varBu, 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)
Çü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())
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ı?
json.dump(sp1_segments + "\n\n", outfile)
misin
Aşağıda writelines () yönteminin sözdizimi verilmiştir.
fileObject.writelines( sequence )
#!/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()
file.write('\n'.join(list))
file
Değişkeni nasıl elde edersiniz ?
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)
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 eval
dosyayı 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
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
writelines
yeni satırlar eklemediğini unutmayın, çünkü aynalarreadlines
, onları da kaldırmaz.