بکندباز

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

زیاد پیش می آید که اطلاعاتی دارید که می خواهید به برنامه های خود وارد و یا از آن خارج کنید، البته نه فقط از صفحه کلید و کنسول. تبادل اطلاعات از طریق فایل های متنی یک روش رایج برای اشتراک گذاری اطلاعات بین برنامه ها است. یکی از محبوب ترین فرمت ها برای تبادل داده، فرمت CSV است. اما چگونه از آن استفاده می کنید؟

بیایید یک چیز را روشن کنیم: شما مجبور نیستید (و نخواهید شد) که کد تجزیه کننده CSV خود را از ابتدا بسازید. چندین کتابخانه کاملاً قابل قبول از قبل وجود دارد که می توانید از آنها استفاده کنید. کتابخانه داخلی csv در پایتون برای اکثر موارد مربوط به تجزیه فایل csv کار خواهد کرد. اگر هم کار شما داده های زیادی دارد و یا تجزیه و تحلیل عددی نیاز دارد، کتابخانه pandas که دارای قابلیت تجزیه CSV نیز هست، برای مدیریت این موارد کافی است.

در این مقاله، نحوه خواندن، پردازش و تجزیه CSV از فایل های متنی را با استفاده از پایتون خواهید آموخت. خواهید دید که فایل‌های CSV چگونه کار می‌کنند، در مورد csv، کتابخانه بسیار مهم تعبیه‌شده در پایتون را یاد می‌گیرید و خواهید دید که تجزیه CSV با استفاده از کتابخانه pandas چگونه کار می‌کند .

پس بیایید شروع کنیم!

فایل CSV چیست؟

فایل CSV (فایل مقادیر جدا شده با کاما) نوعی فایل متنی ساده است که از ساختار خاصی برای مرتب کردن داده های جدولی استفاده می کند. از آنجایی که یک فایل متنی ساده است، فقط می‌تواند حاوی داده‌های متنی واقعی باشد – به عبارت دیگر، کاراکترهای ASCII و یا Unicode قابل چاپ .

ساختار یک فایل CSV با نام آن مشخص شده است. به طور معمول، فایل‌های CSV از یک کاما برای جدا کردن هر مقدار داده خاص استفاده می‌کنند. این ساختار به شکل زیر است:

column 1 name,column 2 name, column 3 name
first row data 1,first row data 2,first row data 3
second row data 1,second row data 2,second row data 3
...

توجه کنید که چگونه هر قطعه داده با کاما از هم جدا می شود. به طور معمول، خط اول فایل، عنوانِ هر بخش از داده را مشخص می کند – به عبارت دیگر، نام ستون داده را. هر خط بعدی پس از آن داده واقعی است که فقط با محدودیت اندازه فایل محدود می شود.

به طور کلی کاراکتر جداکننده، “جداکننده یا delimiter” نامیده می شود و کاما تنها علامت مورد استفاده نیست. دیگر جداکننده های محبوب عبارتند از تب ( \t)، کولون ( :) و نیم دونقطه ( ;). تجزیه صحیح یک فایل CSV مستلزم آن است که بدانیم از کدام جداکننده استفاده می شود.

همانطور که از pip/pipenv برای سایر نصب های پایتون استفاده می شود:

$ pip install pandas

در اینجا به جزئیات نحوه عملکرد pandas یا نحوه استفاده از آن نخواهیم پرداخت و فقط بخشی از قابلیت های این کتابخانه را برای مدیریت فایل های csv بررسی می کنیم.

خواندن فایل های CSV باpandas

برای نشان دادن برخی از قدرت‌های pandas در مدیریت فایل های CSV، یک فایل کمی پیچیده‌تر برای خواندن ایجاد کرده‌ام به نام hrdata.csv. این فایل شامل داده هایی در مورد کارکنان شرکت است:

Name,Hire Date,Salary,Sick Days remaining
Graham Chapman,03/15/14,50000.00,10
John Cleese,06/01/15,65000.00,8
Eric Idle,05/12/14,45000.00,10
Terry Jones,11/01/13,70000.00,3
Terry Gilliam,08/12/14,48000.00,7
Michael Palin,05/23/13,66000.00,8

خواندن CSV به شکل داده DataFrame در pandas سریع و ساده است:

import pandas
df = pandas.read_csv('hrdata.csv')
print(df)

همین: سه خط کد، و البته تنها یکی از این خط ها کار اصلی را انجام می دهد. pandas.read_csv()‎فایل CSV داده شده را باز می کند، تجزیه و تحلیل می کند، می خواند و داده ها را در DataFrame ذخیره می کند.

چاپ نتایج خروجی در قالب DataFrame:

             Name Hire Date   Salary  Sick Days remaining
0  Graham Chapman  03/15/14  50000.0                   10
1     John Cleese  06/01/15  65000.0                    8
2       Eric Idle  05/12/14  45000.0                   10
3     Terry Jones  11/01/13  70000.0                    3
4   Terry Gilliam  08/12/14  48000.0                    7
5   Michael Palin  05/23/13  66000.0                    8

در اینجا چند نکته قابل ذکر است:

  • ابتدا pandasمتوجه شد که خط اول CSV حاوی نام ستون است و به طور خودکار از آنها استفاده کرد. که عملکرد خیلی خوبی است.
  • با این حال، pandasاز ایندکس های عدد صحیح شروع شده از صفر در DataFrame استفاده می کند. این به این دلیل است که ما به آن نگفتیم که ایندکس ما چقدر باید باشد.
  • علاوه بر این، اگر به انواع داده‌های ستون‌های ما نگاه کنید، خواهید دید که ستون‌های  Salary و Sick Days remaining  به درستی به اعداد تبدیل شده است، اما ستون Hire Date همچنان یک string است. همانطور که در حالت تعاملی دیده می شود:
  • >>> print(type(df['Hire Date'][0]))
    <class 'str'>
    

بیایید یکی یکی به این مسائل بپردازیم. برای استفاده از ستون دیگری به عنوان ایندکس DataFrame،  پارامتر اختیاری index_colرا اضافه کنید:

import pandas
df = pandas.read_csv('hrdata.csv', index_col='Name')
print(df)

اکنون فیلد Name ایندکس DataFrame ما است:

               Hire Date   Salary  Sick Days remaining
Name                                                  
Graham Chapman  03/15/14  50000.0                   10
John Cleese     06/01/15  65000.0                    8
Eric Idle       05/12/14  45000.0                   10
Terry Jones     11/01/13  70000.0                    3
Terry Gilliam   08/12/14  48000.0                    7
Michael Palin   05/23/13  66000.0                    8

بعد، بیایید نوع داده فیلد Hire Date را اصلاح کنیم. می‌توانید با پارامتر اختیاری parse_dates، که به‌عنوان فهرستی از نام ستون‌ها به‌عنوان تاریخ در نظر گرفته می‌شود،  pandasرا مجبور به خواندن داده‌ها به‌عنوان یک تاریخ کینم:

import pandas
df = pandas.read_csv('hrdata.csv', index_col='Name', parse_dates=['Hire Date'])
print(df)

به تفاوت در خروجی توجه کنید:

                Hire Date   Salary  Sick Days remaining
Name                                                   
Graham Chapman 2014-03-15  50000.0                   10
John Cleese    2015-06-01  65000.0                    8
Eric Idle      2014-05-12  45000.0                   10
Terry Jones    2013-11-01  70000.0                    3
Terry Gilliam  2014-08-12  48000.0                    7
Michael Palin  2013-05-23  66000.0                    8

اکنون تاریخ به درستی قالب بندی شده است که به راحتی در ترمینال تعاملی دیده می شود:

>>>

>>> print(type(df['Hire Date'][0]))
<class 'pandas._libs.tslibs.timestamps.Timestamp'>

اگر فایل‌های CSV شما در خط اول نام ستون‌ها را ندارند، می‌توانید از پارامتر اختیاری names برای ارائه فهرستی از نام ستون‌ها استفاده کنید. همچنین اگر می خواهید نام ستون های ارائه شده در خط اول را دوباره نویسی کنید نیز، می توانید از این استفاده کنید. در این مورد، باید با استفاده از پارامتر اختیاری header=0  نیز به pandas.read_csv()‎ بگویید که نام ستون های پیشفرض را نادیده بگیرد:

import pandas
df = pandas.read_csv('hrdata.csv', 
            index_col='Employee', 
            parse_dates=['Hired'], 
            header=0, 
            names=['Employee', 'Hired','Salary', 'Sick Days'])
print(df)

توجه داشته باشید که از آنجایی که نام ستون ها تغییر کرده است، ستون های مشخص شده در پارامترهای اختیاری index_col و parse_dates نیز باید تغییر کنند. اکنون خروجی زیر حاصل می شود:

                    Hired   Salary  Sick Days
Employee                                     
Graham Chapman 2014-03-15  50000.0         10
John Cleese    2015-06-01  65000.0          8
Eric Idle      2014-05-12  45000.0         10
Terry Jones    2013-11-01  70000.0          3
Terry Gilliam  2014-08-12  48000.0          7
Michael Palin  2013-05-23  66000.0          8

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

نوشتن یک  DataFrameدر یک فایل CSV به آسانی خواندن آن است. بیایید داده ها را با نام ستون های جدید در یک فایل CSV جدید بنویسیم:

import pandas
df = pandas.read_csv('hrdata.csv', 
            index_col='Employee', 
            parse_dates=['Hired'],
            header=0, 
            names=['Employee', 'Hired', 'Salary', 'Sick Days'])
df.to_csv('hrdata_modified.csv')

تنها تفاوت این کد با کد خواندن قبل این است که تابع print(df) با df.to_csv()‎ جایگزین شده است و نام فایل نیز به عنوان ورودی به این تابع ارسال شده است. فایل CSV جدید به شکل زیر است:

Employee,Hired,Salary,Sick Days
Graham Chapman,2014-03-15,50000.0,10
John Cleese,2015-06-01,65000.0,8
Eric Idle,2014-05-12,45000.0,10
Terry Jones,2013-11-01,70000.0,3
Terry Gilliam,2014-08-12,48000.0,7
Michael Palin,2013-05-23,66000.0,8

نتیجه

اگر اصول اولیه خواندن فایل‌های CSV را بدانید، وقتی نیاز به وارد کردن داده‌ها دارید، هرگز دچار سردرگمی نخواهید شد. اکثر کارهای خواندن، پردازش و نوشتن CSV را می توان به راحتی توسط کتابخانه اصلی csv پایتون انجام داد. اگر داده‌های زیادی برای خواندن و پردازش دارید، کتابخانه pandas قابلیت‌های مدیریت سریع و آسان CSV را نیز فراهم می‌کند.

zohreh

مدیر وب سایت بکندباز

دیدگاه‌ها

*
*