2013-06-20 10 views
32

To jest trochę dziwna prośba, ale szukam sposobu na zapisanie listy do pliku, a następnie przeczytanie jej w innym czasie.Python 2.7 - Napisz i przeczytaj listę z pliku

Nie ma sposobu na przerobienie list, aby były poprawnie sformatowane/sformatowane, tak jak pokazano poniżej.

Moje wykazy mają dane tak:

test 
data 
here 
this 
is one 
group :) 

test 
data 
here 
this 
is another 
group :) 

Odpowiedz

92

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.

+0

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

+0

ucieczka unicode ... Musiałem otworzyć to jako 'wb' z powodu TypeError: musi być str, nie bajty – rluks

+0

@ 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

12

Dopóki plik ma spójnego formatowania (tj line-przerwami), to jest łatwe tylko podstawowe plików IO i ciąg operacji:

with open('my_file.txt', 'rU') as in_file: 
    data = in_file.read().split('\n') 

To będzie przechowywać plik danych w postaci listy przedmiotów , po jednym w linii. Aby następnie umieścić go w pliku, zrobiłbyś coś odwrotnego:

with open('new_file.txt', 'w') as out_file: 
    out_file.write('\n'.join(data)) # This will create a string with all of the items in data separated by new-line characters 

Mam nadzieję, że pasuje do tego, czego szukasz.

+0

+1. Jeśli "dane", o których mówimy, nie są skomplikowane, to IMHO lepiej jest przetasować własny parser jak w tym ans. – brokenfoot