การอ่านและการเขียนรายการไปยังไฟล์ใน Python

บทนำ

โปรแกรมเมอร์ Python ใช้อาร์เรย์ รายการ และพจนานุกรมอย่างเข้มข้นเป็นโครงสร้างข้อมูลแบบอนุกรม การจัดเก็บโครงสร้างข้อมูลเหล่านี้จำเป็นต้องมีไฟล์หรือฐานข้อมูลเพื่อให้ทำงานได้อย่างถูกต้อง

ในบทความนี้ เราจะมาดูวิธีการเขียนรายการไปยังไฟล์ และวิธีอ่านรายการนั้นกลับเข้าไปในหน่วยความจำ

ไปยัง เขียนข้อมูลลงในไฟล์และเพื่อ อ่านข้อมูลจากไฟล์, ภาษาโปรแกรม Python นำเสนอวิธีการมาตรฐาน write() และ read() สำหรับการจัดการกับบรรทัดเดียวเช่นเดียวกับ writelines() และ readlines() เพื่อจัดการกับหลายบรรทัด นอกจากนี้ ทั้ง pickle และ json โมดูลช่วยให้วิธีที่ชาญฉลาดในการจัดการกับชุดข้อมูลที่เป็นอนุกรมเช่นกัน

การใช้ อ่าน() และ เขียน() วิธีการ

เพื่อจัดการกับอักขระ (สตริง) พื้นฐาน read() และ write() วิธีการทำงานได้อย่างยอดเยี่ยม บันทึกรายการดังกล่าวทีละบรรทัดลงในไฟล์ listfile.txt สามารถทำได้ดังนี้:


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

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

พื้นที่ listitem ถูกขยายโดยตัวแบ่งบรรทัด "n"ก่อนแล้วจึงจัดเก็บไว้ในไฟล์เอาต์พุต ตอนนี้เรามาดูวิธีการอ่านรายการทั้งหมดจากไฟล์ listfile.txt กลับเข้าไปในหน่วยความจำ:


places = []


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

โปรดทราบว่าคุณจะต้องลบตัวแบ่งบรรทัดออกจากส่วนท้ายของสตริง ในกรณีนี้ มันช่วยเราที่ Python อนุญาตให้ดำเนินการรายการกับสตริงได้เช่นกัน การลบนี้ทำได้ง่ายๆ เป็นการดำเนินการรายการในสตริง ซึ่งเก็บทุกอย่างไว้ ยกเว้นองค์ประกอบสุดท้าย องค์ประกอบนี้มีอักขระ "n" ที่แสดงถึงตัวแบ่งบรรทัดบนระบบ UNIX/Linux

การใช้ สายการเขียน () และ การอ่าน () วิธีการ

ตามที่กล่าวไว้ในตอนต้นของบทความนี้ Python ยังมีสองวิธี – writelines() และ readlines() - การเขียนและอ่านหลายบรรทัดในขั้นตอนเดียวตามลำดับ มาเขียนรายการทั้งหมดลงในไฟล์บนดิสก์กันเถอะ:


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

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

หากต้องการอ่านรายการทั้งหมดจากไฟล์บนดิสก์ เราต้อง:


places = []


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

โค้ดด้านบนเป็นไปตามแนวทางดั้งเดิมที่ยืมมาจากภาษาโปรแกรมอื่นๆ มาเขียนต่อกันดีกว่า ไพธอน วิธีการ:


places = []


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

ประการแรก เนื้อหาไฟล์จะถูกอ่านผ่าน readlines(). ประการที่สอง ใน for วนซ้ำจากแต่ละบรรทัดอักขระตัวแบ่งบรรทัดจะถูกลบออกโดยใช้ rstrip() กระบวนการ. ประการที่สาม สตริงจะถูกเพิ่มลงในรายการสถานที่เป็นรายการใหม่

เมื่อเปรียบเทียบกับรายการก่อนที่โค้ดจะมีขนาดกะทัดรัดกว่ามาก แต่อาจอ่านยากกว่าสำหรับโปรแกรมเมอร์ Python มือใหม่

การใช้โมดูล Joblib

วิธีการเริ่มต้นที่อธิบายจนถึงตอนนี้จัดเก็บรายการในลักษณะที่มนุษย์ยังสามารถอ่านได้ ซึ่งเป็นรายการตามลำดับในไฟล์อย่างแท้จริง เหมาะอย่างยิ่งสำหรับการสร้างรายงานอย่างง่ายหรือการส่งออกไฟล์สำหรับผู้ใช้เพื่อใช้งานต่อไป เช่น ไฟล์ CSV อย่างไรก็ตาม หากเป้าหมายของคุณคือการเรียงลำดับรายการให้เป็นไฟล์ ซึ่งสามารถโหลดได้ในภายหลัง ไม่จำเป็นต้องจัดเก็บไว้ในรูปแบบที่มนุษย์อ่านได้

พื้นที่ joblib โมดูลให้วิธีที่ง่ายที่สุดในการดัมพ์อ็อบเจกต์ Python (สามารถเป็นอ็อบเจกต์ใดๆ ก็ได้):

import joblib

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

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

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

joblib ยังคงเป็นวิธีที่ง่ายและสะอาดที่สุดในการจัดลำดับออบเจ็กต์ในรูปแบบที่มีประสิทธิภาพ และโหลดในภายหลัง คุณสามารถใช้รูปแบบใดก็ได้เช่น .sav, .data, ฯลฯ ไม่สำคัญหรอก – ทั้งคู่ joblib และทางเลือกอื่นๆ เช่น pickle จะอ่านไฟล์ได้ดี

การใช้ ดอง โมดูล

เพื่อเป็นทางเลือกในการ joblib, เราสามารถใช้ pickle! ของมัน dump() วิธีจัดเก็บรายการอย่างมีประสิทธิภาพเป็นสตรีมข้อมูลไบนารี ประการแรกไฟล์เอาต์พุต listfile.data ถูกเปิดสำหรับการเขียนไบนารี ("wb"). ประการที่สอง รายการจะถูกเก็บไว้ในไฟล์ที่เปิดโดยใช้ dump() วิธี:

import pickle

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

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

ในขั้นตอนต่อไป เราอ่านรายการจากไฟล์ดังนี้ ประการแรกไฟล์เอาต์พุต listfile.data ถูกเปิดไบนารีสำหรับการอ่าน ("rb"). ประการที่สอง รายการสถานที่ถูกโหลดจากไฟล์โดยใช้ปุ่ม load() วิธี:

import pickle

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

สองตัวอย่างนี้แสดงให้เห็นถึงการใช้สตริง แม้ว่า, pickle ใช้งานได้กับอ็อบเจ็กต์ Python ทุกประเภท เช่น สตริง ตัวเลข โครงสร้างแบบกำหนดตัวเอง และโครงสร้างข้อมูลในตัวอื่นๆ ที่ Python มีให้

การใช้รูปแบบ JSON

รูปแบบข้อมูลไบนารี pickle การใช้งานนั้นเฉพาะกับ Python เพื่อปรับปรุงการทำงานร่วมกันระหว่างโปรแกรมต่างๆ JavaScript Object Notation (JSON) มีสคีมาที่ใช้งานง่ายและมนุษย์สามารถอ่านได้ ดังนั้นจึงเป็นที่นิยมอย่างมากสำหรับการจัดลำดับไฟล์และแชร์ไฟล์ผ่าน API

ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!

ตัวอย่างต่อไปนี้สาธิตวิธีเขียนรายการประเภทตัวแปรแบบผสมลงในไฟล์เอาต์พุตโดยใช้คำสั่ง JSON โมดูล. เมื่อเปิดไฟล์เอาต์พุตเพื่อเขียนแล้ว dump() เมธอดเก็บรายการพื้นฐานในไฟล์โดยใช้สัญกรณ์ JSON:

import json


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


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

การอ่านเนื้อหาของไฟล์ที่ส่งออกกลับเข้าสู่หน่วยความจำนั้นง่ายพอๆ กับการเขียนข้อมูล วิธีการที่สอดคล้องกันเพื่อ dump() ชื่อ load():

import json


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

สรุป

วิธีการต่างๆ ที่เราได้แสดงไว้ข้างต้นมีตั้งแต่การเขียน/อ่านข้อมูลอย่างง่ายไปจนถึงการดัมพ์/โหลดข้อมูลผ่านไบนารีสตรีมโดยใช้ Pickle และ JSON วิธีนี้ช่วยลดความยุ่งยากในการจัดเก็บรายการอย่างต่อเนื่องและอ่านกลับเข้าไปในหน่วยความจำ

ประทับเวลา:

เพิ่มเติมจาก สแต็ค