כיצד להמיר רשימה של אובייקטים לקובץ CSV ב- Python [5 Ways] – פינקסטר

Share on facebook
Share on twitter
Share on linkedin
Share on telegram
Share on whatsapp
Share on email
פרסומת
MAGNEZIX מגנזיקס


💬 שְׁאֵלָה: כיצד להמיר רשימה של אובייקטים מותאמים אישית ל-a csv קוֹבֶץ?

דוגמא: נתון היא רשימה של אובייקטים מותאמים אישית מסוג, למשל Employee שמכיל את השם, תיאור התפקיד וההכנסה כך:

salary = [Employee('Alice', 'Data Scientist', 122000),
          Employee('Bob', 'Engineer', 77000),
          Employee('Ann', 'Manager', 119000)]

המטרה שלך היא לכתוב את התוכן של רשימת האובייקטים לתוך א ערכים מופרדים בפסיק פורמט קובץ (CSV).

קובץ הפלט שלך אמור להיראות כך:

# my_file.csv
Alice,Data Scientist,122000
Bob,Engineer,77000
Ann,Manager,119000

פִּתָרוֹן: ישנן ארבע דרכים פשוטות להמיר א רשימה של רשימות לקובץ CSV ב פִּיתוֹן.

  1. CSV: ייבא את csv מודול ב- Python, צור אובייקט כותב csv ומצא רשימה lst של אלמנטים המייצגים כל אובייקט כשורה, שנכתבת לאחר מכן לתוך ה-CSV באמצעות writer.writerow(lst).
  2. פנדות: ייבא את ספריית פנדותהמר כל אובייקט לרשימה כדי לקבל רשימה של רשימות, צור Pandas DataFrame מתוך רשימת הרשימות, וכתוב את ה-DataFrame לקובץ בשיטת DataFrame DataFrame.to_csv('file.csv').
  3. NumPy: ייבא את ספריית NumPyהמר כל אובייקט לרשימה כדי לקבל רשימה של רשימות, צור מערך NumPy וכתוב את הפלט לקובץ CSV באמצעות numpy.savetxt('file.csv', array, delimiter=",") שיטה.
  4. פִּיתוֹן: השתמש טהור פִּיתוֹן יישום שאינו דורש שום ספרייה באמצעות פונקציונליות ה-I/O של קבצי Python.

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

שיטה 1: מודול ה-CSV של Python

אתה יכול להמיר רשימה של רשימות לקובץ CSV ב-Python בקלות – על ידי שימוש ב- csv סִפְרִיָה. זוהי השיטות הניתנות להתאמה אישית ביותר מכל ארבעת השיטות.

class Employee(object):
    def __init__(self, name, description, salary):
        self.name = name
        self.description = description
        self.salary = salary


employees = [Employee('Alice', 'Data Scientist', 122000),
             Employee('Bob', 'Engineer', 77000),
             Employee('Ann', 'Manager', 119000)]


# Method 1
import csv
with open('my_file.csv', 'w', newline="") as f:
    writer = csv.writer(f)
    for x in employees:
        writer.writerow([x.name, x.description, x.salary])
        

תְפוּקָה:

# my_file.csv
Alice,Data Scientist,122000
Bob,Engineer,77000
Ann,Manager,119000

בקוד, תחילה פותחים את הקובץ באמצעות התקן של Python open() פקודה. כעת, אתה יכול לכתוב תוכן לאובייקט הקובץ f.

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

כעת אתה חוזר על האובייקטים וממיר כל אובייקט לרשימה.

לאחר מכן, הרשימה המייצגת שורה אחת מועברת ב- writerow() שיטה של ​​כותב ה-CSV. זה דואג להמרת רשימת האובייקטים לפורמט CSV.

אתה יכול להתאים אישית את כותב ה-CSV בבנאי שלו (למשל, על ידי שינוי המפריד מפסיק ',' לרווח לבן ' ' דמות). עיין במפרט כדי ללמוד עליו שינויים מתקדמים.

שיטה 2: Pandas DataFrame to_csv()

שיטה זו ממירה רשימה של אובייקטים לקובץ CSV בשני שלבים:

רשימת רשימות ל-CSV

אתה יכול להמיר רשימה של רשימות ל-a פנדות DataFrame המספק לך יכולות עוצמתיות כגון to_csv() שיטה.

זוהי גישה סופר פשוטה שנמנעת מיבוא ספרייה נוספת (בכל מקרה אני משתמש ב-Pandas בפרויקטים רבים של Python).

class Employee(object):
    def __init__(self, name, description, salary):
        self.name = name
        self.description = description
        self.salary = salary


employees = [Employee('Alice', 'Data Scientist', 122000),
             Employee('Bob', 'Engineer', 77000),
             Employee('Ann', 'Manager', 119000)]


# Method 2
import pandas as pd

# Step 1: Convert list of objects to list of lists
lst = [[x.name, x.description, x.salary] for x in employees]

# Step 2: Convert list of lists to CSV
df = pd.DataFrame(lst)
df.to_csv('my_file.csv', index=False, header=False)

תְפוּקָה:

# my_file.csv
Alice,Data Scientist,122000
Bob,Engineer,77000
Ann,Manager,119000

קוד שלבים עיקריים:

  1. lst = [[x.name, x.description, x.salary] for x in employees]
  2. df = pd.DataFrame(lst)
  3. df.to_csv('my_file.csv', index=False, header=False)

אתה ממיר רשימה של אובייקטים לקובץ CSV בשלושה שלבים עיקריים.

  1. ראשית, המר את רשימת האובייקטים לרשימת רשימות באמצעות הבנת רשימה לחזור על כל אובייקט ולהמיר כל אובייקט לרשימה פנימית באמצעות הביטוי המותאם אישית שלך.
  2. שנית, צור א Pandas DataFrameייצוג ברירת המחדל של Python של נתונים טבלאיים.
  3. שלישית, ה-DataFrame הוא מבנה נתונים חזק מאוד המאפשר לך לבצע שיטות שונות. אחד מאלה הוא ה to_csv() שיטה המאפשרת לך לכתוב את תוכנו לקובץ CSV.

אתה מגדיר את index ו header טיעוני ה to_csv() שיטה ל False מכיוון ש-Pandas, כברירת מחדל, מוסיפה מדדי שורה ועמודה שלמים 0, 1, 2, ….

חשבו עליהם כעל מדדי השורות והעמודות בגיליון האלקטרוני של Excel. אתה לא רוצה שהם יופיעו בקובץ ה-CSV אז אתה מגדיר את הארגומנטים ל False.

אם אתה רוצה להתאים אישית את פלט ה-CSV, יש לך הרבה טיעונים מיוחדים לשחק איתם. לבדוק זֶה מאמר לרשימה מקיפה של כל הטיעונים.

🌍 מאמר קשור: גיליונות רמאות של Pandas להצמיד לקיר שלך

שיטה 3: NumPy savetext()

NumPy הוא בליבה של פייתון מדע נתונים ו למידת מכונה פונקציונליות. אֲפִילוּ פנדות משתמש במערכים NumPy כדי ליישם פונקציונליות קריטית.

אתה יכול להמיר רשימה של אובייקטים לקובץ CSV על ידי המרתה תחילה לרשימת רשימות אשר לאחר מכן מומרת למערך NumPy, ולאחר מכן באמצעות של NumPy savetext() פוּנקצִיָה על ידי העברת מערך NumPy כארגומנט.

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

class Employee(object):
    def __init__(self, name, description, salary):
        self.name = name
        self.description = description
        self.salary = salary


employees = [Employee('Alice', 'Data Scientist', 122000),
             Employee('Bob', 'Engineer', 77000),
             Employee('Ann', 'Manager', 119000)]


# Method 3
import numpy as np

# Convert list of objects to list of lists
lst = [[hash(x.name), hash(x.description), x.salary] for x in employees]

# Convert list of lists to NumPy array
a = np.array(lst)

# Convert array to CSV
np.savetxt('my_file.csv', a, delimiter=",")

בקוד, אנו משתמשים ב- hash() פונקציה כדי לקבל ערך מספרי עבור תכונות המחרוזת name ו description של ה Employee מעמד.

תְפוּקָה:

# my_file.csv
-8.655249391637094400e+18,-4.821993523891147776e+18,1.220000000000000000e+05
7.826671284149683200e+18,-7.040934892515148800e+18,7.700000000000000000e+04
3.577554885237667328e+18,1.887669837421876992e+18,1.190000000000000000e+05

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

שיטה 4: פייתון טהור ללא תלות חיצונית

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

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

שיטה זו היא הטובה ביותר אם אתה לא רוצה או לא יכול להשתמש בתלות חיצונית.

class Employee(object):
    def __init__(self, name, description, salary):
        self.name = name
        self.description = description
        self.salary = salary


employees = [Employee('Alice', 'Data Scientist', 122000),
             Employee('Bob', 'Engineer', 77000),
             Employee('Ann', 'Manager', 119000)]


# Method 4
with open('my_file.csv', 'w') as f:
    for x in employees:
        f.write(f'{x.name},{x.description},{x.salary}\n')
        

תְפוּקָה:

# my_file.csv
Alice,Data Scientist,122000,
Bob,Engineer,77000,
Ann,Manager,119000,

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

אנחנו משתמשים ב-Python's מחרוזת f פונקציונליות לעשות זאת בצורה תמציתית. בסוף כל שורה, אתה מציב את תו השורה החדשה '\n'.

שיטה 5 – בונוס: Python One-Liner

השיטה הקודמת היא א חד-לינרי גרסה של שיטה 4. אם אתה חלק מקהילת Finxter, אתה יודע איך אני אוהב ספינות יחיד. 😉

# Method 5
open('my_file.csv', 'w').writelines([f'{x.name},{x.description},{x.salary}\n' for x in employees])

תמציתית, לא? הפלט זהה לקודם.

אם אתה מתעניין באומנות היצירה של כדורים יפים, בדוק את הספר שלי בנושא!

Python One-Liner ספר: שלטו תחילה בשורה היחידה!

מתכנתי Python ישפרו את כישורי מדעי המחשב שלהם עם ה-one-liners השימושיים הללו.

Python One-Liner

Python One-Liner ילמד אותך איך לקרוא ולכתוב "one-liners": הצהרות תמציתית של פונקציונליות שימושית ארוזות בשורה אחת של קוד. תלמד כיצד לפרוק ולהבין באופן שיטתי כל שורה של קוד Python, ולכתוב Python רהוט, דחוס בעוצמה כמו מומחה.

חמשת הפרקים של הספר מכסים (1) טיפים וטריקים, (2) ביטויים רגולריים, (3) למידת מכונה, (4) נושאי ליבה במדעי הנתונים ו- (5) אלגוריתמים שימושיים…



קישור לכתבת המקור – 2022-07-25 17:05:59

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on telegram
Telegram
Share on whatsapp
WhatsApp
Share on email
Email
פרסומת
תכנון תשתיות רפואיות

עוד מתחומי האתר