Pisanie listy do pliku za pomocą Pythona

Czy jest to najczystszy sposób zapisu listy do pliku, ponieważ writelines() nie wstawia znaków nowej linii?

file.writelines(["%s\n" % item  for item in list])
Wygląda na to, że byłby standardowy sposób...
Author: APerson, 2009-05-22

22 answers

Możesz użyć pętli:

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

W Pythonie 2 Możesz również użyć

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

Jeśli zależy ci na pojedynczym wywołaniu funkcji, Usuń przynajmniej nawiasy kwadratowe [], aby drukowane ciągi były tworzone pojedynczo (genexp zamiast listcomp) -- nie ma powodu, aby zabierać całą pamięć potrzebną do zmaterializowania całej listy ciągów.

 1041
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-14 17:39:08

Co zamierzasz zrobić z plikiem? Czy ten plik istnieje dla ludzi lub innych programów o jasnych wymaganiach interoperacyjności?

Jeśli próbujesz serializować listę na dysk do późniejszego wykorzystania przez tę samą aplikację Pythona, powinieneś być pickleing Lista.

import pickle

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

Do przeczytania:

with open ('outfile', 'rb') as fp:
    itemlist = pickle.load(fp)
 423
Author: SingleNegationElimination,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-09 05:42:40

Prostszym sposobem jest:

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

Możesz upewnić się, że wszystkie elementy na liście elementów są ciągami znaków za pomocą wyrażenia generatora:

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

Pamiętaj, że wszystkie itemlist listy muszą być w pamięci, więc zadbaj o zużycie pamięci.

 333
Author: osantana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-20 14:41:38

Using Python 3 and Python 2.6+ składnia:

with open(filepath, 'w') as file_handler:
    for item in the_list:
        file_handler.write("{}\n".format(item))
To jest niezależne od platformy. Kończy również linię końcową znakiem nowej linii, który jest najlepszą praktyką Uniksa.

Począwszy od Pythona 3.6, "{}\n".format(item) można zastąpić ciągiem f: f"{item}\n".

 101
Author: orluke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-23 17:03:15

Yet another way. Serializacja do json za pomocą simplejson (dołączony jako json w Pythonie 2.6):

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

Jeśli sprawdzisz wyjście.txt:

[1, 2, 3, 4]

Jest to przydatne, ponieważ składnia jest pythoniczna, jest czytelna dla człowieka i może być odczytywana przez inne programy w innych językach.

 93
Author: Jason Baker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-22 18:20:19

Pomyślałem, że byłoby ciekawie zbadać korzyści płynące z używania genexp, więc oto moje podejście.

Przykład w pytaniu używa nawiasów kwadratowych do tworzenia listy tymczasowej, a więc jest równoważny:

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

, które niepotrzebnie konstruuje tymczasową listę wszystkich linii, które zostaną zapisane, może to pochłonąć znaczną ilość pamięci w zależności od wielkości listy i tego, jak szczegółowy jest wynik str(item).

Upuść nawiasy kwadratowe (równoważne aby usunąć zawijanie list() wywołanie powyżej) zamiast tego przekaże tymczasowy generator do file.writelines():

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

Ten generator utworzy reprezentację zakończoną znakiem nowej linii Twoich obiektów item na żądanie(tzn. tak, jak są zapisywane). Jest to miłe z kilku powodów:

    Pamięć jest niewielka, nawet w przypadku bardzo dużych list.]}
  • Jeśli {[4] } jest powolny, widoczny jest postęp w pliku, ponieważ każdy element jest przetwarzany

To pozwala uniknąć pamięci zagadnienia, takie jak:

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

(wywołałem ten błąd ograniczając Max Pythona. pamięć wirtualna do ~100MB z ulimit -v 102400).

Przykładając zużycie pamięci do jednej strony, ta metoda nie jest w rzeczywistości szybsza niż oryginalna:

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

(Python 2.6.2 na Linuksie)

 39
Author: RobM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 18:13:19

Bo jestem leniwy....

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())
 23
Author: Big Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-10 20:55:23

Serializowanie listy do pliku tekstowego z rozdzieloną przecinkami wartością

mylist = dir()
with open('filename.txt','w') as f:
    f.write( ','.join( mylist ) )
 19
Author: themadmax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-18 08:51:01

Ogólnie

Poniżej znajduje się składnia metody writelines ()

fileObject.writelines( sequence )

Przykład

#!/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()

Odniesienie

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

 16
Author: Marvin W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-18 06:01:51
file.write('\n'.join(list))
 13
Author: mtasic85,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-22 18:29:47
with open ("test.txt","w")as fp:
   for line in list12:
       fp.write(line+"\n")
 8
Author: shankar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-10 18:14:57

Możesz również użyć funkcji drukowania, jeśli jesteś na python3 w następujący sposób.

f = open("myfile.txt","wb")
print(mylist, file=f)
 7
Author: Nandita Damaraju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-30 21:50:24

W Pythonie > 3 możesz użyć print i * do rozpakowania argumentów:

with open("fout.txt", "w") as fout:
    print(*my_list, sep="\n", file=fout)
 7
Author: bricoletc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-05 15:03:43

Dlaczego nie spróbujesz

file.write(str(list))
 4
Author: Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 23:47:34

Ta logika najpierw przekonwertuje elementy z listy na string(str). Czasami lista zawiera krotkę jak

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

Ta logika zapisuje do pliku każdą krotkę w nowej linii. Możemy później użyć eval podczas ładowania każdej krotki podczas czytania pliku:

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 
 2
Author: Tahir Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-12 15:05:14

Użycie numpy.savetxt jest również opcją:

import numpy as np

np.savetxt('list.txt', list, delimiter="\n", fmt="%s")
 2
Author: kamilazdybal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-13 13:11:35

Inny sposób iteracji i dodawania nowej linii:

for item in items:
    filewriter.write(f"{item}" + "\n")
 1
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-14 20:54:20

Przydatne może być również przekierowanie stdout do pliku:

from contextlib import redirect_stdout
with open('test.txt', 'w') as f:
  with redirect_stdout(f):
     for i in range(mylst.size):
        print(mylst[i])
 0
Author: Youjun Hu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-09 07:53:03

Można również przejść przez następujące:

Przykład:

my_list=[1,2,3,4,5,"abc","def"]
with open('your_file.txt', 'w') as file:
    for item in my_list:
        file.write("%s\n" % item)

Wyjście:

W your_file.txt elementy są zapisywane w następujący sposób:

1

2

3

4

5

abc

def

Twój skrypt również zapisuje jak wyżej.

W przeciwnym razie możesz użyć ogórka

import pickle
my_list=[1,2,3,4,5,"abc","def"]
#to write
with open('your_file.txt', 'wb') as file:
    pickle.dump(my_list, file)
#to read
with open ('your_file.txt', 'rb') as file:
    Outlist = pickle.load(file)
print(Outlist)

Wyjście: [1, 2, 3, 4, 5, 'abc", "def"]

Zapisuje listę tak samo jak listę, gdy ją wczytamy, możemy ją odczytać.

Również przez simplejson możliwe to samo co powyższe wyjście

import simplejson as sj
my_list=[1,2,3,4,5,"abc","def"]
#To write
with open('your_file.txt', 'w') as file:
    sj.dump(my_list, file)

#To save
with open('your_file.txt', 'r') as file:
    mlist=sj.load(file)
print(mlist)
 0
Author: MRUNAL MUNOT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-02 17:41:58

W Python3 możesz użyć tej pętli

with open('your_file.txt', 'w') as f:
    for item in list:
        f.print("", item)
 -1
Author: Nikhil B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-28 10:15:47

Niech avg będzie listą, wtedy:

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

Możesz użyć %e lub %s w zależności od wymagań.

 -2
Author: belthazar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-15 13:05:30
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

Jak To Działa: Najpierw otwórz plik, używając wbudowanej funkcji open i podając nazwę plik i tryb, w którym chcemy otworzyć plik. Tryb może być tryb odczytu ('r'), tryb zapisu ('w') lub tryb dołączania ('a'). Możemy również określić niezależnie od tego, czy czytamy, piszemy, czy dodajemy w trybie tekstowym ('t') czy binarnym mode ("b"). Dostępnych jest o wiele więcej trybów i pomoc (Otwarta) poda ci więcej szczegółów na ich temat. Domyślnie open() uważa plik za be a ' t ' ext plik i otwiera go w trybie 'r'. W naszym przykładzie najpierw otwieramy plik w trybie zapisu tekstowego i używamy zapisu metoda obiektu file do zapisu do pliku i wtedy ostatecznie zamykamy plik.

Powyższy przykład pochodzi z książki" a Byte of Python " autorstwa Swaroopa C H. swaroopch.com

 -4
Author: vayah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-14 10:37:44