کار با ماژول CSV در پایتون

ترجمه و تالیف : ارسطو عباسی
تاریخ انتشار : 10 اسفند 98
خواندن در 1 دقیقه
دسته بندی ها : پایتون

 در این مطلب از وبسایت راکت قصد داریم شیوه تعامل با فایل‌های CSV را از طریق اسکریپت‌های پایتون یاد بگیریم. 

مقدمه

CSV فایلی است که در آن داده‌های متنی به صورت جداول منظم در کنار هم‌دیگر قرار می‌گیرند. می‌توان این دسته از فایل‌ها را در برنامه‌های مختلفی مانند مایکروسافت آفیس، Google Spreadsheets و یا Libreoffice Calc مشاهده کرد.

نوشتن در فایل‌های CSV

ابتدا یک فایل جدید پایتونی ایجاد کرده و ماژول CSV را در آن import کنید:

import csv

در ماژول csv می‌توانید شاهد متدهایی باشید که برای خواندن و ویرایش فایل‌های csv استفاده می‌شود. ما در ادامه قصد داریم این متدها را برای کارهایی که می‌خواهیم انجام دهیم بررسی کنیم.

برای ایجاد یک فایل CSV اولین کاری که باید بکنیم نام‌گذاری آن است، ما این کار را از طریق یک متغیر ساده انجام خواهیم داد. کار بعدی قرار دادن یکسری header و data برای فایل csv است که ما آن را از طریق لیست و tuple انجام خواهیم داد:

filename = "imdb_top_4.csv"
header = ("Rank", "Rating", "Title")
data = [
(1, 9.2, "The Shawshank Redemption(1994)"),
(2, 9.2, "The Godfather(1972)"),
(3, 9, "The Godfather: Part II(1974)"),
(4, 8.9, "Pulp Fiction(1994)")
]

حال نیاز است تا یک تابع جدید با ورودی‌های filename، header و data ایجاد کنیم:

def writer(header, data, filename):
  pass

برای ایجاد و نوشتن یک فایل جدید نیاز است تا از متد writer که مربوط به ماژول csv می‌شود استفاده کنیم. برای ایجاد ستون جدید متد writerow را در اختیار داریم که قرار است در ردیف اول ستون‌های مورد نظر را ایجاد کرده و در ردیف‌های بعدی نیز لیست data را قرار دهد:

def writer(header, data, filename):
  with open (filename, "w", newline = "") as csvfile:
    movies = csv.writer(csvfile)
    movies.writerow(header)
    for x in data:
      movies.writerow(x)

حال اگر برنامه را اجرا کنید در مسیر پیش‌فرض یک فایل جدید را مشاهده خواهید کرد. خروجی این فایل باید به صورت زیر باشد:

کار با ماژول CSV در پایتون

بروزرسانی و ایجاد تغییرات در فایل CSV

برای ویرایش فایل csv یک تابع جدید با یک پارامتر (نام فایل) را ایجاد خواهیم کرد:

def updater(filename):
    with open(filename, newline= "") as file:
        readData = [row for row in csv.DictReader(file)]
        # print(readData)
        readData[0]['Rating'] = '9.4'
        # print(readData)

    readHeader = readData[0].keys()
    writer(readHeader, readData, filename, "update")

این تابع ابتدا فایل مورد نظر را دریافت کرده و سپس متن آن‌را در حالت خواندن به متغیر readData اضافه می‌کند. در قسمت بعدی باید دیتا قبلی فراخوانی شده و با مقدار جدید جایگزین شود. 

آخرین مرحله نیز فراخوانی دوباره تابع writer برای اعمال تغییرات است.

البته در نظر داشته باشید که برای بروزرسانی نیاز است تا آرگومان جدیدی را به تابع writer اضافه کنید. به همین دلیل است که در قطعه کد بالا رشته update به تابع writer اضافه شده است. برای انجام چنین کاری تنها کافی‌ست در زمان تعریف تابع writer ورودی option را به صورت زیر اضافه کنید:

def writer(header, data, filename, option):

حال باید روی بخش option کنترل داشته باشیم. چراکه نسبت به write و update نیاز است تا واکنش‌های متفاوتی داشته باشد.

برای انجام چنین کاری یک شرط را به تابع اصلی یعنی writer اضافه می‌کنیم:

def writer(header, data, filename, option):
        with open (filename, "w", newline = "") as csvfile:
            if option == "write":

                movies = csv.writer(csvfile)
                movies.writerow(header)
                for x in data:
                    movies.writerow(x)
            elif option == "update":
                writer = csv.DictWriter(csvfile, fieldnames = header)
                writer.writeheader()
                writer.writerows(data)
            else:
                print("Option is not known")

شکل کدهای شما تا این بخش از مطلب باید به صورت زیر باشد:

در پایان

پایتون یکی از منعطف‌ترین زبان‌های برنامه‌نویسی برای کار با دیتا‌های مختلف است. CSV نیز یکی از موارد بسیار مهم در بین قالب‌های مختلف داده‌ای‌ست که به لطف ماژول CSV به سادگی می‌توانیم با آن تعامل برقرار کنیم.

گردآوری و تالیف ارسطو عباسی
آفلاین
user-avatar

من ارسطو‌ام :) کافی نیست؟! :)

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید