קריאת קבצים עם Python

מבוא

כדי לעבוד עם נתונים מאוחסנים, טיפול בקבצים הופך לידע הליבה של כל מתכנת Python מקצועי. כבר מההוצאה המוקדמת ביותר, גם קריאה וגם כתיבת נתונים לקבצים הם תכונות מובנות של Python. בהשוואה לשפות תכנות אחרות כמו C או Java, זה די פשוט ודורש רק כמה שורות קוד. יתר על כן, אין צורך לטעון מודול נוסף כדי לעשות זאת כראוי.

במאמר זה נסביר כיצד לקרוא קבצים עם Python באמצעות דוגמאות. כמה דוגמאות כוללות קריאת קובץ שורה אחר שורה, כחתיכה (מספר מוגדר של שורות בכל פעם), וקריאת קובץ במכה אחת. כמו כן, נראה לך דרך לקרוא שורה ספציפית מהקובץ, בלבד, מבלי לחפש בכל הקובץ.

יסודות הקבצים ב-Python

השיטות הנפוצות לפעול עם קבצים הן open() כדי לפתוח קובץ, seek() כדי להגדיר את המיקום הנוכחי של הקובץ בהיסט הנתון, ו close() כדי לסגור את אובייקט הקובץ כשתסיים להשתמש בו. המובנה open() הפונקציה מחזירה ידית קובץ המייצגת אובייקט קובץ שישמש לגישה לקובץ לקריאה, כתיבה או הוספה.

כשפותחים קובץ לקריאה, Python צריך לדעת בדיוק איך צריך לפתוח את הקובץ עם המערכת. שני מצבי גישה זמינים - קריאה וקריאה במצב בינארי. הדגלים המתאימים בשימוש הם 'r', ו 'rb', ויש לציין בעת ​​פתיחת קובץ עם המובנה open() פוּנקצִיָה. המצב הראשון כולל את הפרשנות של תווים מיוחדים כמו "CR" (החזרת כרכרה) ו-"LF" (הזנת שורה) כדי לייצג מעברי שורה, בעוד שהמצב הבינארי מאפשר לך לקרוא את הנתונים במצב גולמי - שבו הנתונים מאוחסנים כפי שהם. ללא פרשנות נוספת.

לאחר פתיחת קובץ, ה- open() הפונקציה תחזיר לך אובייקט קובץ. לאובייקטים של קבצים אלה יש שיטות כמו read(), readline(), write(), tell(), ו seek(). בעוד שאובייקטי קבצים מסוימים (או אובייקטים דמויי קובץ) כוללים יותר שיטות מאלו המפורטות כאן, אלו הן הנפוצות ביותר. לא כל אובייקטי הקבצים צריכים ליישם את כל שיטות הקובץ.

קריאת קובץ שורה אחר שורה

הדוגמה הראשונה היא בהשראת שתי שפות התכנות - C ו-C++. זו כנראה הגישה האינטואיטיבית ביותר - פתח את הקובץ באמצעות open() פוּנקצִיָה, קרא את הקובץ שורה אחר שורה באמצעות readline() שיטה, ופלט את השורה מיד לאחר הקריאה.

בשימוש כאן הוא א while לולאה שקוראת ברציפות מהקובץ כל עוד ה- readline() השיטה ממשיכה להחזיר נתונים. במקרה של הגעה לסוף הקובץ (EOF) while הלולאה נעצרת ואובייקט הקובץ נסגר, ומפנה את המשאבים לשימוש של תוכניות אחרות:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

כפי שאולי ציינת, פתחנו וסגרנו במפורש את הקובץ בדוגמה זו. למרות שמתורגמן Python סוגר את הקבצים שנפתחו אוטומטית בתום ההפעלה של תוכנית Python, סגירת הקובץ באופן מפורש באמצעות close() הוא סגנון תכנות טוב, ואסור לשכוח אותו.

כשיפור, ה פרוטוקול איטרטור נוח הוצג ב- Python 2.3. זה מאפשר לך לפשט את readline לולאה:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

בשימוש כאן הוא א for לולאה בשילוב עם in איטרטור. הקו הנוכחי מזוהה בעזרת ה in iterator, קרא מהקובץ, והתוכן שלו מופלט אל stdout. Python מכסה עבורך את הפתיחה והסגירה של הקובץ כאשר הוא נופל מחוץ לתחום. אמנם זה לא יעיל, אבל זה מאפשר לך לא להתמודד יותר עם טיפולים בקבצים.

לרוע המזל, הקוד שלמעלה פחות מפורש ומסתמך על איסוף האשפה הפנימי של Python כדי לטפל בסגירת הקובץ.

הוצג ב-Python 2.5, ה with הפקודה מקפסת את כל התהליך אפילו יותר, וגם מטפלת בפתיחה ובסגירה של קבצים רק פעם אחת לאורך בלוק הקוד בהיקף:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

השילוב של ה with הצהרה ו open() הפקודה פותחת את הקובץ פעם אחת בלבד. אם מצליח ה for לולאה מבוצעת, ותוכן השורה מודפס על stdout.

יתר על כן, השימוש ב- with להצהרה יש תופעת לוואי. באופן פנימי, מתורגמן Python יוצר א try-finally-בלוק כדי להכיל קריאה מהקובץ. הדוגמה הבאה מראה מה קורה בעצם ב-Python עם ה- with חסימות קוד:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

קריאת קובץ כחתיכות של שורות

עד כה, עיבדנו קובץ שורה אחר שורה. זה די איטי עבור קבצים ענקיים וניתן לשפר אותו על ידי קריאת שורות מרובות בו זמנית. כדי להשיג זאת, ה islice() שיטה מתוך כלי עבודה מודול נכנס לפעולה. כמו כן, הוא פועל כאיטרטור ומחזיר נתח נתונים שמורכב ממנו n שורות. בסוף הקובץ, התוצאה עשויה להיות קצרה יותר, ולבסוף, השיחה תחזיר רשימה ריקה:

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

קריאת שורה ספציפית מקובץ

באמצעות השיטות המוצגות למעלה נוכל לבצע גם פעולות שימושיות אחרות, כמו קריאת שורה ספציפית מקובץ. לשם כך, אנו עושים שימוש במונה ומדפיסים את השורה המתאימה כאשר אנו מגיעים אליו תוך איטרציה בקובץ:


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

זה צריך להיות פשוט להבנה, אבל זה קצת יותר ארוך מהדוגמאות הקודמות. ניתן לקצר באמצעות ה linecache מודול.

הדוגמה הבאה מראה כיצד לפשט את הקוד באמצעות ה- getline() שיטה. אם מספר השורה המבוקש נופל מטווח השורות התקפות בקובץ, אזי getline() השיטה מחזירה מחרוזת ריקה במקום זאת:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

קריאת הקובץ כולו בבת אחת

אחרון חביב, נסתכל על מקרה שונה מאוד מהדוגמה הקודמת - קריאת קובץ שלם במכה אחת.

זכור שברוב המקרים אמור להיות לך מספיק זיכרון כדי לקרוא את כל הקובץ, מכיוון שתווים לא תופסים יותר מדי מקום, אלא יגעים בקבצים גדולים. הדוגמה הבאה משתמשת בשילוב של with הצהרה, ואת read() שיטה. במקרה זה, נשתמש read() כדי לטעון את תוכן הקובץ כזרם נתונים:

עיין במדריך המעשי והמעשי שלנו ללימוד Git, עם שיטות עבודה מומלצות, סטנדרטים מקובלים בתעשייה ודף רמאות כלול. תפסיק לגוגל פקודות Git ולמעשה ללמוד זה!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

Python מציעה גם את readlines() שיטה, הדומה ל- readline() שיטה מהדוגמה הראשונה. בניגוד ל read(), תוכן הקובץ מאוחסן ברשימה, כאשר כל שורה בתוכן היא פריט:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

בעוד readlines() יקרא תוכן מהקובץ עד שהוא יגיע ל-EOF, זכור שאתה יכול גם להגביל את כמות התוכן הנקרא על ידי מתן sizehint פרמטר, שהוא מספר הבתים לקריאה.

סיכום

כרגיל, יש יותר מדרך אחת לקרוא את התוכן של קובץ. מבחינת מהירות, כולם פחות או יותר באותה קטגוריה. איזה פתרון מתאים לך ביותר תלוי במקרה השימוש הספציפי שלך. אנחנו חושבים שזה די מועיל לראות מה אפשרי ואז לבחור את הפתרון המתאים ביותר.

בעוד ש-Python מפשט מאוד את תהליך קריאת הקבצים, זה עדיין יכול להיות מסובך לפעמים, ובמקרה זה הייתי ממליץ לך להסתכל על תיעוד רשמי של Python למידע נוסף.

בול זמן:

עוד מ Stackabuse