Odczytywanie i zapisywanie list do pliku w Pythonie

Wprowadzenie

Programiści Pythona intensywnie używają tablic, list i słowników jako serializowanych struktur danych. Trwałe przechowywanie tych struktur danych wymaga do prawidłowego działania pliku lub bazy danych.

W tym artykule przyjrzymy się, jak zapisać listę do pliku i jak wczytać tę listę z powrotem do pamięci.

Do zapisz dane w plikuOraz odczytać dane z pliku, język programowania Python oferuje standardowe metody write() i read() do radzenia sobie z jedną linią, a także writelines() i readlines() do radzenia sobie z wieloma liniami. Co więcej, zarówno pickle oraz json Moduły pozwalają również na sprytne sposoby radzenia sobie z serializowanymi zestawami danych.

Korzystanie z czytać() i pisać() Metody

Aby radzić sobie ze znakami (ciągami) podstawowe read() i write() metody działają doskonale. Zapisywanie takiej listy linia po linii do pliku listfile.txt można to zrobić w następujący sposób:


places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    for listitem in places:
        filehandle.write(f'{listitem}n')

Połączenia listitem jest przedłużony o łamanie wiersza "n", po pierwsze, a następnie przechowywane w pliku wyjściowym. Teraz możemy przyjrzeć się, jak odczytać całą listę z pliku listfile.txt z powrotem do pamięci:


places = []


with open('listfile.txt', 'r') as filehandle:
    for line in filehandle:
        
        curr_place = line[:-1]
        
        places.append(curr_place)

Pamiętaj, że musisz usunąć koniec linii z końca ciągu. W tym przypadku pomaga nam to, że Python pozwala również na operacje listowe na łańcuchach. To usunięcie jest po prostu wykonywane jako operacja listy na samym łańcuchu, który zachowuje wszystko oprócz ostatniego elementu. Ten element zawiera znak "n" który reprezentuje łamanie linii w systemach UNIX/Linux.

Korzystanie z napisy() i czytane() Metody

Jak wspomniano na początku tego artykułu, Python zawiera również dwie metody – writelines() i readlines() – odpowiednio pisać i czytać wiele wierszy w jednym kroku. Zapiszmy całą listę do pliku na dysku:


places_list = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    filehandle.writelines(f"{place for place in places_list}n")

Aby odczytać całą listę z pliku na dysku musimy:


places = []


with open('listfile.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()
    for line in filecontents:
        
        curr_place = line[:-1]
        
        places.append(curr_place)

Powyższy kod jest zgodny z bardziej tradycyjnym podejściem zapożyczonym z innych języków programowania. Napiszmy to w więcej Pythona droga:


places = []


with open('listfile.txt', 'r') as filehandle:
    places = [current_place.rstrip() for current_place in filehandle.readlines()]

Po pierwsze, zawartość pliku jest odczytywana przez readlines(). Po drugie, w for pętla z każdej linii znak końca linii jest usuwany za pomocą rstrip() metoda. Po trzecie, ciąg jest dodawany do listy miejsc jako nowy element listy.

W porównaniu z listingiem przed kodem, kod jest znacznie bardziej zwarty, ale może być trudniejszy do odczytania dla początkujących programistów Pythona.

Korzystanie z modułu Joblib

Początkowe metody wyjaśnione do tej pory przechowują listę w taki sposób, że ludzie mogą ją nadal czytać – dosłownie sekwencyjną listę w pliku. Świetnie nadaje się do tworzenia prostych raportów lub wysyłania plików eksportu do dalszego użytku przez użytkowników, takich jak pliki CSV. Jeśli jednak Twoim celem jest po prostu serializacja listy do pliku, który można później załadować, nie ma potrzeby przechowywania jej w formacie czytelnym dla człowieka.

Połączenia joblib moduł zapewnia najprostszy sposób na zrzucenie obiektu Pythona (może to być naprawdę dowolny obiekt):

import joblib

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

joblib.dump(places, 'places.sav')

places = joblib.load('places.sav')
print(places) 

joblib pozostaje najprostszym i najczystszym sposobem na serializowanie obiektów w wydajnym formacie i ładowanie ich później. Możesz użyć dowolnego formatu, takiego jak .sav, .dataitd. To nie ma znaczenia – oba joblib i alternatywy, takie jak pickle odczyta pliki dobrze.

Korzystanie z marynata Moduł

Jako alternatywa dla joblib, możemy użyć pickle! Jego dump() Metoda skutecznie przechowuje listę jako strumień danych binarnych. Po pierwsze, plik wyjściowy listfile.data jest otwarty do zapisu binarnego ("wb"). Po drugie, lista jest przechowywana w otwartym pliku za pomocą dump() metoda:

import pickle

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.data', 'wb') as filehandle:
    
    pickle.dump(places, filehandle)

W następnym kroku odczytujemy listę z pliku w następujący sposób. Po pierwsze, plik wyjściowy listfile.data jest otwarty do odczytu binarnego ("rb"). Po drugie, lista miejsc jest ładowana z pliku za pomocą load() metoda:

import pickle

with open('listfile.data', 'rb') as filehandle:
    
    placesList = pickle.load(filehandle)

Dwa przykłady tutaj demonstrują użycie ciągów. Mimo że, pickle współpracuje ze wszystkimi rodzajami obiektów Pythona, takimi jak ciągi znaków, liczby, samodefiniujące się struktury i każda inna wbudowana struktura danych, którą zapewnia Python.

Korzystanie z formatu JSON

Format danych binarnych pickle używa jest specyficzne dla Pythona. Aby poprawić współdziałanie między różnymi programami, JavaScript Object Notation (JSON) zapewnia łatwy w użyciu i czytelny dla człowieka schemat, dzięki czemu stał się bardzo popularny w przypadku serializacji plików i udostępniania ich za pośrednictwem interfejsów API.

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!

Poniższy przykład pokazuje, jak napisać listę mieszanych typów zmiennych do pliku wyjściowego za pomocą funkcji json moduł. Po otwarciu pliku wyjściowego do zapisu, dump() metoda przechowuje podstawową listę w pliku przy użyciu notacji JSON:

import json


basic_list = [1, "Cape Town", 4.6]


with open('listfile.txt', 'w') as filehandle:
    json.dump(basic_list, filehandle)

Odczytywanie zawartości pliku wyjściowego z powrotem do pamięci jest tak proste, jak zapisywanie danych. Odpowiednia metoda do dump() ma nazwę load():

import json


with open('listfile.txt', 'r') as filehandle:
    basic_list = json.load(filehandle)

Wnioski

Różne metody, które pokazaliśmy powyżej, obejmują proste zapisywanie/odczytywanie danych, aż po zrzucanie/ładowanie danych za pośrednictwem strumieni binarnych przy użyciu pikle i JSON. Upraszcza to trwałe przechowywanie listy i wczytywanie jej z powrotem do pamięci.

Znak czasu:

Więcej z Nadużycie stosu