Đọc và ghi danh sách vào một tệp bằng Python

Giới thiệu

Các lập trình viên Python sử dụng chuyên sâu các mảng, danh sách và từ điển làm cấu trúc dữ liệu tuần tự. Việc lưu trữ các cấu trúc dữ liệu này liên tục yêu cầu tệp hoặc cơ sở dữ liệu hoạt động bình thường.

Trong bài viết này, chúng ta sẽ xem xét cách ghi danh sách vào tệp và cách đọc lại danh sách đó vào bộ nhớ.

Đến ghi dữ liệu vào một tệp, Và để đọc dữ liệu từ một tệp, ngôn ngữ lập trình Python cung cấp các phương thức tiêu chuẩn write()read() để xử lý một dòng, cũng như writelines()readlines() để xử lý nhiều dòng. Hơn nữa, cả hai picklejson mô-đun cũng cho phép các cách xử lý thông minh với các tập dữ liệu được tuần tự hóa.

Sử dụng đọc()ghi () Phương pháp

Để xử lý các ký tự (chuỗi), điều cơ bản read()write() các phương pháp hoạt động xuất sắc. Lưu danh sách từng dòng như vậy vào tệp listfile.txt có thể được thực hiện như sau:


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

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

Sản phẩm listitem được kéo dài bởi một dấu ngắt dòng "n", trước tiên, và sau đó được lưu trữ vào tệp đầu ra. Bây giờ chúng ta có thể xem cách đọc toàn bộ danh sách từ tệp listfile.txt trở lại bộ nhớ:


places = []


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

Hãy nhớ rằng bạn sẽ cần xóa dấu ngắt dòng ở cuối chuỗi. Trong trường hợp này, nó giúp chúng tôi rằng Python cũng cho phép các hoạt động danh sách trên chuỗi. Việc loại bỏ này được thực hiện đơn giản như một thao tác liệt kê trên chính chuỗi, thao tác này sẽ giữ lại mọi thứ trừ phần tử cuối cùng. Phần tử này chứa ký tự "n" đại diện cho ngắt dòng trên hệ thống UNIX / Linux.

Sử dụng writelines ()readlines () Phương pháp

Như đã đề cập ở đầu bài viết này, Python cũng chứa hai phương thức: writelines()readlines() - để viết và đọc nhiều dòng trong một bước tương ứng. Hãy ghi toàn bộ danh sách vào một tệp trên đĩa:


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

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

Để đọc toàn bộ danh sách từ một tệp trên đĩa, chúng ta cần:


places = []


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

Đoạn mã trên tuân theo một cách tiếp cận truyền thống vay mượn từ các ngôn ngữ lập trình khác. Hãy viết nó trong một chi tiết Kim tự tháp đường:


places = []


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

Thứ nhất, nội dung tệp được đọc qua readlines(). Thứ hai, trong một for vòng lặp từ mỗi dòng, ký tự ngắt dòng được xóa bằng cách sử dụng rstrip() phương pháp. Thứ ba, chuỗi được thêm vào danh sách địa điểm dưới dạng một mục danh sách mới.

So với danh sách trước, mã nhỏ gọn hơn nhiều, nhưng có thể khó đọc hơn đối với các lập trình viên Python mới bắt đầu.

Sử dụng Mô-đun Joblib

Các phương thức ban đầu được giải thích cho đến nay lưu trữ danh sách theo cách mà con người vẫn có thể đọc được - khá đúng nghĩa là một danh sách tuần tự trong một tệp. Điều này rất tốt để tạo các báo cáo đơn giản hoặc xuất ra các tệp xuất để người dùng sử dụng thêm, chẳng hạn như tệp CSV. Tuy nhiên - nếu mục đích của bạn là chỉ tuần tự hóa một danh sách thành một tệp, tệp đó có thể được tải sau đó, thì không cần phải lưu trữ nó ở định dạng con người có thể đọc được.

Sản phẩm joblib mô-đun cung cấp cách dễ nhất để kết xuất một đối tượng Python (thực sự có thể là bất kỳ đối tượng nào):

import joblib

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

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

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

joblib vẫn là cách đơn giản và sạch sẽ nhất để tuần tự hóa các đối tượng ở một định dạng hiệu quả và tải chúng sau đó. Bạn có thể sử dụng bất kỳ định dạng tùy ý nào, chẳng hạn như .sav, .data, v.v. Nó không thực sự quan trọng - cả hai joblib và các lựa chọn thay thế như pickle sẽ đọc các tập tin tốt.

Sử dụng dưa chua Mô-đun

Như một sự thay thế cho joblib, chúng ta có thể sử dụng pickle! Nó là dump() phương pháp lưu trữ danh sách một cách hiệu quả dưới dạng một luồng dữ liệu nhị phân. Thứ nhất, tệp đầu ra listfile.data được mở để viết nhị phân ("wb"). Thứ hai, danh sách được lưu trữ trong tệp đã mở bằng cách sử dụng dump() phương pháp:

import pickle

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

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

Bước tiếp theo, chúng tôi đọc danh sách từ tệp như sau. Thứ nhất, tệp đầu ra listfile.data được mở nhị phân để đọc ("rb"). Thứ hai, danh sách các địa điểm được tải từ tệp bằng cách sử dụng load() phương pháp:

import pickle

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

Hai ví dụ ở đây chứng minh việc sử dụng các chuỗi. Mặc dù, pickle hoạt động với tất cả các loại đối tượng Python như chuỗi, số, cấu trúc tự định nghĩa và mọi cấu trúc dữ liệu dựng sẵn khác mà Python cung cấp.

Sử dụng định dạng JSON

Định dạng dữ liệu nhị phân pickle sử dụng cụ thể cho Python. Để cải thiện khả năng tương tác giữa các chương trình khác nhau, Ký hiệu đối tượng JavaScript (JSON) cung cấp một lược đồ dễ sử dụng và con người có thể đọc được và do đó trở nên rất phổ biến để tuần tự hóa các tệp và chia sẻ chúng qua các API.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Ví dụ sau minh họa cách ghi danh sách các kiểu biến hỗn hợp vào tệp đầu ra bằng cách sử dụng json mô-đun. Sau khi mở tệp đầu ra để ghi, dump() phương thức lưu trữ danh sách cơ bản trong tệp bằng cách sử dụng ký hiệu JSON:

import json


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


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

Đọc lại nội dung của tệp đầu ra vào bộ nhớ cũng đơn giản như ghi dữ liệu. Phương pháp tương ứng để dump() được đặt tên load():

import json


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

Kết luận

Các phương pháp khác nhau mà chúng tôi đã trình bày ở trên bao gồm từ việc ghi / đọc dữ liệu đơn giản cho đến kết xuất / tải dữ liệu qua các luồng nhị phân bằng cách sử dụng pickle và JSON. Điều này giúp đơn giản hóa việc lưu trữ danh sách liên tục và đọc lại vào bộ nhớ.

Dấu thời gian:

Thêm từ xếp chồng lên nhau