Jeśli nie trzeba go mieć czytelny dla człowieka/edytowalne, najprostszym rozwiązaniem jest po prostu użyć pickle
.
Aby napisać:
with open(the_filename, 'wb') as f:
pickle.dump(my_list, f)
Aby przeczytać:
with open(the_filename, 'rb') as f:
my_list = pickle.load(f)
Jeśli zrobić muszą im być czytelny dla człowieka, potrzebujemy więcej informacji.
Jeśli my_list
gwarantuje się listą ciągów bez żadnych osadzonymi znakami nowej linii, wystarczy napisać do nich po jednym w wierszu:
with open(the_filename, 'w') as f:
for s in my_list:
f.write(s + '\n')
with open(the_filename, 'r') as f:
my_list = [line.rstrip('\n') for line in f]
Jeśli są ciągi Unicode zamiast ciągów bajtów, będziesz chcesz je encode
. (Lub, co gorsza, jeśli są ciągami bajtów, ale niekoniecznie są w tym samym kodowaniu, co domyślne ustawienia systemu.)
Jeśli mogą one zawierać znaki nowej linii lub znaki niedrukowalne itp., Można użyć funkcji escaping lub cytowania . Python ma wiele różnych rodzajów ucieczki wbudowanych w stdlib.
Użyjmy unicode-escape
tutaj, aby rozwiązać obu powyższych problemów na raz:
with open(the_filename, 'w') as f:
for s in my_list:
f.write((s + u'\n').encode('unicode-escape'))
with open(the_filename, 'r') as f:
my_list = [line.decode('unicode-escape').rstrip(u'\n') for line in f]
Można również skorzystać z rozwiązania 3.x stylu w 2.x, albo z modułem codecs
lub moduł io
: *
import io
with io.open(the_filename, 'w', encoding='unicode-escape') as f:
f.writelines(line + u'\n' for line in my_list)
with open(the_filename, 'r') as f:
my_list = [line.rstrip(u'\n') for line in f]
* TOOWTDI, więc który jest jeden oczywisty sposób? To zależy ... Dla krótkiej wersji: jeśli chcesz pracować z wersjami Python przed 2.6, użyj codecs
; jeśli nie, użyj io
.
Lubię bibliotekę pikle, która jest całkiem słodka i działa idealnie.Już to zaimplementowałem i wygląda na to, że działa dobrze. Dziękuję, oznaczę cię jak zielony kleszcz, gdy tylko mi pozwoli. – Ryflex
ucieczka unicode ... Musiałem otworzyć to jako 'wb' z powodu TypeError: musi być str, nie bajty – rluks
@ Pan.student: Używasz Pythona 3.x, prawda? W Pythonie 2, o co pytało to pytanie, 'str' i' bytes' są tego samego typu, a różnica między plikami binarnymi a plikami tekstowymi jest po prostu tłumaczeniem nowej linii. W Pythonie 3 'str' i' unicode' są tego samego typu, a różnica między plikami binarnymi a plikami tekstowymi polega na tym, że pliki tekstowe są automatycznie kodowane i dekodowane. (Możesz zachować 3.x-podobne zachowanie, jeśli 2.x, jeśli jesteś ostrożny, w tym pliki tekstowe w stylu 3.x z 'io.open', ale pytający tego nie robił.) – abarnert