csv --- خواندن و نوشتن پرونده CSV¶
کد منبع: Lib/csv.py
قالب بهاصطلاح CSV (مقادیر جداشده با ویرگول) رایجترین قالب ایمپورت و اکسپورت برای صفحات گسترده و پایگاههای داده است. قالب CSV سالها پیش از تلاشها برای توصیف این قالب بهصورت استانداردشده در RFC 4180 استفاده میشد. فقدان یک استاندارد خوشتعریف به این معناست که اغلب تفاوتهای ظریفی در دادههای تولیدشده و مصرفشده توسط برنامههای کاربردی مختلف وجود دارد. این تفاوتها میتوانند پردازش پروندههای CSV از منابع متعدد را آزاردهنده سازند. با این حال، با وجود اینکه جداکنندهها و نویسههای نقلقول متفاوتاند، قالب کلی بهاندازهای مشابه است که میتوان یک ماژول واحد نوشت که چنین دادههایی را بهطور کارآمد دستکاری کند و جزئیات خواندن و نوشتن دادهها را از برنامهنویس پنهان کند.
ماژول csv کلاسهایی را برای خواندن و نوشتن دادههای جدولی در قالب CSV پیادهسازی میکند. این ماژول به برنامهنویسان اجازه میدهد بگویند: «این دادهها را در قالب مورد نظر Excel بنویس» یا «دادهها را از این پرونده که توسط Excel تولید شده است بخوان»، بدون آنکه جزئیات دقیق قالب CSV مورد استفاده Excel را بدانند. برنامهنویسان همچنین میتوانند قالبهای CSV قابلفهم برای سایر برنامهها را توصیف کنند یا قالبهای CSV خاصمنظور خود را تعریف کنند.
اشیای reader و writer ماژول csv دنبالهها را میخوانند و مینویسند. برنامهنویسان همچنین میتوانند دادهها را در قالب دیکشنری با استفاده از کلاسهای DictReader و DictWriter بخوانند و بنویسند.
همچنین ملاحظه نمائید
- PEP 305 - API پروندهی CSV
پیشنهاد بهبود پایتون (Python Enhancement Proposal) که این افزوده را برای پایتون پیشنهاد داد.
محتویات ماژول¶
ماژول csv توابع زیر را تعریف میکند:
- csv.reader(csvfile, /, dialect='excel', **fmtparams)¶
یک شیء خواننده برمیگرداند که سطرهای csvfile دادهشده را پردازش میکند. یک csvfile باید یک پیمایشپذیر از رشتهها باشد، که هرکدام در قالب csv تعریفشدهی خواننده قرار دارند. csvfile معمولاً یک شیء شبهپرونده یا فهرست است. اگر csvfile یک شیء پرونده باشد، باید با
newline=''باز شود. [1] میتوان یک پارامتر اختیاری dialect را ارائه کرد که برای تعریف مجموعهای از پارامترهای مختص یک گویش CSV خاص استفاده میشود. این پارامتر ممکن است نمونهای از یک زیرکلاس از کلاسDialectیا یکی از رشتههای برگرداندهشده توسط تابعlist_dialects()باشد. میتوان سایر آرگومانهای کلیدواژهای اختیاری fmtparams را برای بازنویسی پارامترهای قالببندی جداگانه در گویش فعلی ارائه کرد. برای جزئیات کامل درباره گویش و پارامترهای قالببندی، بخش گویشها و پارامترهای قالببندی را ببینید.هر ردیف خواندهشده از پرونده csv بهصورت فهرستی از رشتهها برگردانده میشود. هیچ تبدیل خودکار نوع دادهای انجام نمیشود، مگر اینکه گزینه قالب
QUOTE_NONNUMERICمشخص شده باشد (در این صورت فیلدهای بدون علامت نقلقول به float تبدیل میشوند).یک مثال کوتاه از کاربرد:
>>> import csv >>> with open('eggs.csv', newline='') as csvfile: ... spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') ... for row in spamreader: ... print(', '.join(row)) Spam, Spam, Spam, Spam, Spam, Baked Beans Spam, Lovely Spam, Wonderful Spam
که
eggs.csvشامل:Spam Spam Spam Spam Spam |Baked Beans| Spam |Lovely Spam| |Wonderful Spam|
- csv.writer(csvfile, /, dialect='excel', **fmtparams)¶
یک شیء نویسنده را برمیگرداند که مسئول تبدیل دادههای کاربر به رشتههای جداشده روی شیء شبهپرونده دادهشده است. csvfile میتواند هر شیءای با متد
write()باشد. اگر csvfile یک شیء پرونده است، باید باnewline=''باز شود [1]. میتوان یک پارامتر اختیاری dialect را داد که برای تعریف مجموعهای از پارامترهای مختص یک گویش CSV معین استفاده میشود. این ممکن است نمونهای از زیرکلاسی از کلاسDialectیا یکی از رشتههای برگرداندهشده توسط تابعlist_dialects()باشد. میتوان سایر آرگومانهای کلیدواژهای اختیاری fmtparams را برای لغو پارامترهای قالببندی منفرد در گویش فعلی داد. برای جزئیات کامل درباره گویشها و پارامترهای قالببندی، بخش گویشها و پارامترهای قالببندی را ببینید. برای اینکه تا حد امکان برقراری رابط با ماژولهایی که DB API را پیادهسازی میکنند آسان شود، مقدارNoneبهصورت رشته خالی نوشته میشود. هرچند این تبدیل بازگشتپذیر نیست، اما نوشتن مقادیر دادهی SQL NULL در پروندههای CSV بدون پیشپردازش دادههای برگرداندهشده از فراخوانیcursor.fetch*را آسانتر میکند. تمام دادههای غیررشتهای دیگر پیش از نوشته شدن باstr()به رشته تبدیل میشوند.یک مثال کوتاه از کاربرد:
import csv with open('eggs.csv', 'w', newline='') as csvfile: spamwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
که
eggs.csvرا مینویسد، شامل:Spam Spam Spam Spam Spam |Baked Beans| Spam |Lovely Spam| |Wonderful Spam|
- csv.register_dialect(name, /, dialect='excel', **fmtparams)¶
dialect را با name مرتبط میکند. name باید یک رشته باشد. میتوان گویش را با ارسال یک زیرکلاس از
Dialect، یا با آرگومانهای کلیدواژهای fmtparams، یا هر دو مشخص کرد؛ در این حالت آرگومانهای کلیدواژهای پارامترهای گویش را بازنویسی میکنند. برای جزئیات کامل درباره گویشها و پارامترهای قالببندی، بخش گویشها و پارامترهای قالببندی را ببینید.
- csv.unregister_dialect(name)¶
گویش مرتبط با name را از رجیستری گویشها حذف کنید. اگر name یک نام گویش ثبتشده نباشد، یک
Errorپرتاب میشود.
- csv.get_dialect(name)¶
گویش مرتبط با name را برمیگرداند. اگر name یک نام گویش ثبتشده نباشد، یک
Errorپرتاب میشود. این تابع یکDialectتغییرناپذیر برمیگرداند.
- csv.list_dialects()¶
نام تمام گویشهای ثبتشده را برمیگرداند.
- csv.field_size_limit()¶
- csv.field_size_limit(new_limit)
حداکثر اندازه فیلدی که پارسر در حال حاضر مجاز میداند را برمیگرداند. اگر new_limit داده شود، به حد جدید تبدیل میشود.
ماژول csv کلاسهای زیر را تعریف میکند:
- class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)¶
یک شیء ایجاد کنید که مانند یک خواننده معمولی عمل میکند، اما اطلاعات هر ردیف را به یک
dictنگاشت میکند که کلیدهای آن توسط پارامتر اختیاری fieldnames مشخص میشوند.پارامتر fieldnames یک sequence است. اگر fieldnames ارائه نشود، مقدارهای ردیف اول پرونده f بهعنوان fieldnames استفاده میشوند و از نتایج حذف خواهند شد. اگر fieldnames ارائه شود، از آنها استفاده میشود و ردیف اول در نتایج گنجانده خواهد شد. صرفنظر از اینکه fieldnames چگونه تعیین میشوند، دیکشنری ترتیب اصلی آنها را حفظ میکند.
اگر یک ردیف فیلدهای بیشتری نسبت به fieldnames داشته باشد، دادههای باقیمانده در یک فهرست قرار میگیرند و با نام فیلد مشخصشده توسط restkey (که مقدار پیشفرض آن
Noneاست) ذخیره میشوند. اگر یک ردیف غیرخالی فیلدهای کمتری نسبت به fieldnames داشته باشد، مقادیر گمشده با مقدار restval (که مقدار پیشفرض آنNoneاست) پر میشوند.تمام سایر آرگومانهای اختیاری یا کلیدواژهای به نمونهی زیربنایی
readerارسال میشوند.اگر آرگومان دادهشده به fieldnames یک پیمایشگر باشد، به یک
listتبدیل میشود.تغییر یافته در نسخهی 3.6: ردیفهای برگرداندهشده اکنون از نوع
OrderedDictهستند.تغییر یافته در نسخهی 3.8: ردیفهای برگرداندهشده اکنون از نوع
dictهستند.یک مثال کوتاه از کاربرد:
>>> import csv >>> with open('names.csv', newline='') as csvfile: ... reader = csv.DictReader(csvfile) ... for row in reader: ... print(row['first_name'], row['last_name']) ... Eric Idle John Cleese >>> print(row) {'first_name': 'John', 'last_name': 'Cleese'}
که
names.csvشامل موارد زیر است:first_name,last_name Eric,Idle John,Cleese
- class csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)¶
یک شیء ایجاد کنید که مانند یک نویسنده معمولی عمل میکند، اما دیکشنریها را به ردیفهای خروجی نگاشت میکند. پارامتر fieldnames یک
دنبالهاز کلیدها است که ترتیب نوشتن مقادیر موجود در دیکشنری ارسالشده به متدwriterow()در پرونده f را مشخص میکند. پارامتر اختیاری restval مقداری را مشخص میکند که در صورت نبودن کلیدی از fieldnames در دیکشنری، نوشته میشود. اگر دیکشنری ارسالشده به متدwriterow()شامل کلیدی باشد که در fieldnames یافت نمیشود، پارامتر اختیاری extrasaction مشخص میکند که چه عملی باید انجام شود. اگر روی'raise'، که مقدار پیشفرض است، تنظیم شود، یکValueErrorپرتاب میشود. اگر روی'ignore'تنظیم شود، مقادیر اضافی در دیکشنری نادیده گرفته میشوند. سایر آرگومانهای اختیاری یا کلیدواژهای به نمونهی زیرینwriterارسال میشوند.توجه داشته باشید که برخلاف کلاس
DictReader، پارامتر fieldnames در کلاسDictWriterاختیاری نیست.اگر آرگومان دادهشده به fieldnames یک پیمایشگر باشد، به یک
listتبدیل میشود.یک مثال کوتاه از کاربرد:
import csv with open('names.csv', 'w', newline='') as csvfile: fieldnames = ['first_name', 'last_name'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'}) writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'}) writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
که
names.csvرا با محتوای زیر مینویسد:first_name,last_name Baked,Beans Lovely,Spam Wonderful,Spam
- class csv.Dialect¶
کلاس
Dialectیک کلاس دربرگیرنده است که ویژگیهای آن حاوی اطلاعاتی درباره نحوه مدیریت علامتهای نقلقول دوتایی، فضای خالی، جداکنندهها و غیره است. به دلیل نبود یک مشخصه دقیق برای CSV، برنامههای مختلف دادههای CSV با تفاوتهای ظریف تولید میکنند. نمونههایDialectنحوه رفتار نمونههایreaderوwriterرا تعریف میکنند.تمام نامهای موجود
Dialectتوسطlist_dialects()برگردانده میشوند، و میتوان آنها را با کلاسهای مشخصreaderوwriterاز طریق توابع مقداردهی اولیه (__init__) آنها به این صورت ثبت کرد:import csv with open('students.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile, dialect='unix')
- class csv.excel¶
کلاس
excelویژگیهای معمول یک پرونده CSV تولیدشده توسط Excel را تعریف میکند. این کلاس با نام گویش (dialect)'excel'ثبت شده است.
- class csv.excel_tab¶
کلاس
excel_tabویژگیهای معمول یک پرونده جداشده با TAB تولیدشده توسط اکسل را تعریف میکند. این کلاس با نام گویش'excel-tab'ثبت شده است.
- class csv.unix_dialect¶
کلاس
unix_dialectویژگیهای معمول یک پرونده CSV تولیدشده در سیستمهای UNIX را تعریف میکند؛ یعنی استفاده از'\n'بهعنوان پایاندهندهی خط و در علامت نقلقول قرار دادن همهی فیلدها. این کلاس با نام گویش'unix'ثبت شده است.اضافه شده در نسخهی 3.2.
- class csv.Sniffer¶
کلاس
Snifferبرای استنتاج قالب یک پرونده CSV استفاده میشود.کلاس
Snifferدو متد ارائه میدهد:- sniff(sample, delimiters=None)¶
sample دادهشده را تحلیل کنید و زیرکلاسی از
Dialectبرگردانید که پارامترهای یافتشده را بازتاب میدهد. اگر پارامتر اختیاری delimiters داده شده باشد، بهعنوان رشتهای حاوی نویسههایی تفسیر میشود که ممکن است جداکنندههای معتبری باشند.If several delimiters fit the sample equally well --- for example if both
','and';'split every row consistently --- the delimiters listed in thepreferredattribute are preferred, in that order, no matter how many times each of them occurs.
- has_header(sample)¶
متن نمونه را تحلیل میکند (فرض میشود در قالب CSV باشد) و اگر به نظر برسد که ردیف اول مجموعهای از سرستونها است،
Trueرا برمیگرداند. در بررسی هر ستون، یکی از دو معیار کلیدی برای تخمین اینکه آیا نمونه حاوی سرستون است در نظر گرفته میشود:ردیفهای دوم تا n-ام شامل مقادیر عددی هستند
ردیفهای دوم تا n-ام شامل رشتههایی هستند که در آنها طول دستکم یک مقدار با طول سرآیند فرضی آن ستون متفاوت است.
۲۱ ردیف پس از سرآیند نمونهبرداری میشوند؛ اگر بیش از نیمی از ستونها + ردیفها معیارها را برآورده کنند،
Trueبرگردانده میشود.
توجه
این متد یک هیوریستیک سرانگشتی است و ممکن است هم مثبتهای کاذب و هم منفیهای کاذب تولید کند.
The
Snifferclass has the following attribute:- preferred¶
The list of the delimiters preferred for breaking ties, in the order of preference. It can be modified. Its initial value is
[',', '\t', ';', ' ', ':'].
مثالی برای استفاده از Sniffer:
with open('example.csv', newline='') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
# ... process CSV file contents here ...
ماژول csv ثابتهای زیر را تعریف میکند:
- csv.QUOTE_MINIMAL¶
Instructs
writerobjects to only quote those fields which contain special characters such as delimiter, quotechar,'\r','\n'or any of the characters in lineterminator. If doublequote isFalseand escapechar is set, the quotechar is escaped instead of causing the field to be quoted.
- csv.QUOTE_NONNUMERIC¶
به اشیای
writerدستور میدهد که تمام فیلدهای غیرعددی را در علامت نقلقول قرار دهند.به اشیای
readerدستور میدهد که همه فیلدهای بدون علامت نقلقول را به نوعfloatتبدیل کنند.توجه
برخی از انواع عددی، مانند
bool،FractionیاIntEnum، نمایش رشتهای دارند که نمیتوان آن را بهfloatتبدیل کرد. این موارد را نمیتوان در حالتهایQUOTE_NONNUMERICوQUOTE_STRINGSخواند.
- csv.QUOTE_NONE¶
به اشیای
writerدستور میدهد که هرگز فیلدها را با علامت نقلقول محصور نکنند. هنگامی که در حالت فعلی، delimiter، quotechar، escapechar،'\r'،'\n'یا هر یک از نویسههای موجود در lineterminator در داده خروجی ظاهر شود، نویسهی escapechar فعلی پیش از آن قرار میگیرد. اگر escapechar تنظیم نشده باشد، شیء writer در صورت مواجهه با هر نویسهای که نیاز به خنثی کردن دارد، استثنایErrorرا پرتاب میکند. برای جلوگیری از خنثی شدن quotechar، آن را رویNoneتنظیم کنید.به اشیای
readerدستور میدهد که هیچ پردازش خاصی روی نویسههای نقلقول انجام ندهند.
- csv.QUOTE_NOTNULL¶
به اشیای
writerدستور میدهد که تمام فیلدهایی را کهNoneنیستند، در علامت نقلقول قرار دهند. این مشابهQUOTE_ALLاست، با این تفاوت که اگر مقدار یک فیلدNoneباشد، یک رشته خالی (بدون علامت نقلقول) نوشته میشود.به اشیای
readerدستور میدهد که یک فیلد خالی (بدون علامت نقلقول) را بهعنوانNoneتفسیر کنند و در غیر این صورت مانندQUOTE_ALLرفتار کنند.اضافه شده در نسخهی 3.12.
- csv.QUOTE_STRINGS¶
به اشیای
writerدستور میدهد که همیشه فیلدهایی را که رشته هستند در علامت نقلقول قرار دهند. این مشابهQUOTE_NONNUMERICاست، با این تفاوت که اگر مقدار یک فیلدNoneباشد، یک رشتهی خالی (بدون علامت نقلقول) نوشته میشود.به اشیای
readerدستور میدهد که یک رشته خالی (بدون علامت نقلقول) را بهعنوانNoneتفسیر کنند و در غیر این صورت مانندQUOTE_NONNUMERICرفتار کنند.اضافه شده در نسخهی 3.12.
ماژول csv استثنای زیر را تعریف میکند:
- exception csv.Error¶
در صورت تشخیص خطا، توسط هر یک از توابع پرتاب میشود.
گویشها و پارامترهای قالببندی¶
برای آسانتر کردن تعیین قالب رکوردهای ورودی و خروجی، پارامترهای قالببندی خاصی در گویشها (dialects) گروهبندی شدهاند. یک گویش، زیرکلاسی از کلاس Dialect است که شامل ویژگیهای مختلفی است که قالب پرونده CSV را توصیف میکنند. هنگام ایجاد اشیای reader یا writer، برنامهنویس میتواند یک رشته یا زیرکلاسی از کلاس Dialect را بهعنوان پارامتر dialect مشخص کند. علاوه بر، یا بهجای، پارامتر dialect، برنامهنویس همچنین میتواند پارامترهای قالببندی جداگانهای را مشخص کند که نامهایی مشابه ویژگیهای تعریفشده در زیر برای کلاس Dialect دارند.
گویشها از ویژگیهای زیر پشتیبانی میکنند:
- Dialect.delimiter¶
یک رشته تکنویسهای که برای جدا کردن فیلدها استفاده میشود. پیشفرض آن
','است.
- Dialect.doublequote¶
کنترل میکند که نمونههای quotechar که درون یک فیلد ظاهر میشوند، خود چگونه باید نقلقول شوند. هنگامی که
Trueباشد، نویسه دو برابر میشود. هنگامی کهFalseباشد، از escapechar بهعنوان پیشوندی برای quotechar استفاده میشود. مقدار پیشفرض آنTrueاست.در خروجی، اگر doublequote
Falseباشد و هیچ escapechar تنظیم نشده باشد، در صورتی که یک quotechar در یک فیلد یافت شود،Errorپرتاب میشود.
- Dialect.escapechar¶
یک رشتهی تکنویسهای که نویسنده برای خنثی کردن نویسههایی که نیاز به خنثیسازی دارند از آن استفاده میکند:
اگر quoting روی
QUOTE_NONEتنظیم شده باشد، delimiter، quotechar،'\r'،'\n'و هر یک از نویسههای موجود در lineterminator خنثی میشوند؛اگر doublequote برابر
Falseباشد، quotechar خنثی میشود؛خود escapechar.
هنگام خواندن، escapechar هرگونه معنای خاصی را از نویسهی بعدی میگیرد. مقدار پیشفرض آن
Noneاست که خنثیسازی را غیرفعال میکند.تغییر یافته در نسخهی 3.10: Previously the escapechar itself was not escaped, which lost it on reading.
تغییر یافته در نسخهی 3.11: escapechar خالی مجاز نیست.
- Dialect.lineterminator¶
رشتهای که برای پایاندادن به سطرهای تولیدشده توسط
writerاستفاده میشود. مقدار پیشفرض آن'\r\n'است.توجه
readerبهصورت سختکد (hard-coded) برای تشخیص'\r'یا'\n'بهعنوان پایان خط تنظیم شده است و lineterminator را نادیده میگیرد. این رفتار ممکن است در آینده تغییر کند.
- Dialect.quotechar¶
یک رشتهی تکنویسهای که برای نقلقول کردن فیلدهای حاوی نویسههای خاص، مانند delimiter یا quotechar، یا فیلدهای حاوی نویسههای خط جدید (
'\r'،'\n'یا هر یک از نویسههای موجود در lineterminator) استفاده میشود. مقدار پیشفرض آن'"'است. در صورتی که quoting رویQUOTE_NONEتنظیم شده باشد، میتوان آن را رویNoneتنظیم کرد تا از خنثی کردن'"'جلوگیری شود.تغییر یافته در نسخهی 3.11: quotechar خالی مجاز نیست.
- Dialect.quoting¶
کنترل میکند که چه زمانی علامتهای نقلقول باید توسط نویسنده تولید و توسط خواننده شناسایی شوند. این مقدار میتواند هر یک از ثابتهای QUOTE_* را بپذیرد و اگر quotechar برابر
Noneنباشد، پیشفرض آنQUOTE_MINIMALاست و در غیر این صورتQUOTE_NONEاست.
اشیاء خواننده (Reader)¶
اشیای Reader (نمونههای DictReader و اشیای برگرداندهشده از تابع reader()) دارای متدهای عمومی زیر هستند:
- csvreader.__next__()¶
ردیف بعدی شیء پیمایشپذیر reader را بهعنوان یک فهرست (اگر شیء از
reader()بازگردانده شده باشد) یا یک دیکشنری (اگر یک نمونهDictReaderباشد)، تجزیهشده بر اساسDialectجاری، برمیگرداند. معمولاً باید آن را بهصورتnext(reader)فراخوانی کنید.
اشیای Reader دارای ویژگیهای عمومی زیر هستند:
- csvreader.dialect¶
توضیحی فقطخواندنی دربارهی گویش (dialect) مورد استفادهی پارسر .
- csvreader.line_num¶
تعداد سطرهای خواندهشده از پیمایشگر منبع. این تعداد با تعداد رکوردهای برگرداندهشده یکسان نیست، زیرا رکوردها میتوانند شامل چندین خط باشند.
اشیای DictReader ویژگی عمومی زیر را دارند:
- DictReader.fieldnames¶
اگر هنگام ایجاد شیء بهعنوان پارامتر ارسال نشده باشد، این ویژگی در اولین دسترسی یا هنگام خواندن اولین رکورد از پرونده مقداردهی اولیه میشود.
اشیای نویسنده¶
اشیای writer (نمونههای DictWriter و اشیایی که تابع writer() برمیگرداند) دارای متدهای عمومی زیر هستند. برای اشیای writer، یک ردیف باید یک پیمایشپذیر از رشتهها یا اعداد باشد و برای اشیای DictWriter باید یک دیکشنری باشد که نام فیلدها را به رشتهها یا اعداد نگاشت میکند (با اعمال str() روی آنها در ابتدا). توجه داشته باشید که اعداد مختلط با پرانتز در اطرافشان نوشته میشوند. این موضوع ممکن است برای برنامههای دیگری که پروندههای CSV را میخوانند (اگر اصلاً از اعداد مختلط پشتیبانی کنند) مشکلاتی ایجاد کند.
- csvwriter.writerow(row, /)¶
پارامتر row را در شیء فایلِ نویسنده، با قالببندی مطابق
Dialectجاری بنویسید. مقدار بازگشتیِ فراخوانی متد write شیء پرونده زیربنایی را برگردانید.تغییر یافته در نسخهی 3.5: پشتیبانی از پیمایشپذیرهای دلخواه افزوده شد.
- csvwriter.writerows(rows, /)¶
تمام عناصر موجود در rows (یک پیمایشپذیر از اشیای row همانگونه که در بالا توضیح داده شد) را در شیء پرونده نویسنده مینویسد، بهصورت قالببندیشده بر اساس گویش (dialect) جاری.
اشیای Writer دارای ویژگی عمومی زیر هستند:
- csvwriter.dialect¶
توضیحی فقطخواندنی از گویش (dialect) که نویسنده از آن استفاده میکند.
اشیای DictWriter دارای متد عمومی زیر هستند:
- DictWriter.writeheader()¶
ردیفی شامل نام فیلدها (همانطور که در سازنده مشخص شده است) را در شیء فایلِ نویسنده بنویسید؛ این ردیف مطابق گویش (dialect) جاری قالببندی میشود. مقدار بازگشتیِ فراخوانی داخلی
csvwriter.writerow()را برگردانید.اضافه شده در نسخهی 3.2.
تغییر یافته در نسخهی 3.8:
writeheader()اکنون نیز مقداری را که متدcsvwriter.writerow()، که بهصورت داخلی استفاده میشود، برمیگرداند، برمیگرداند.
مثالها¶
سادهترین مثال برای خواندن یک پرونده CSV:
import csv
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
خواندن یک پرونده با قالب جایگزین:
import csv
with open('passwd', newline='') as f:
reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
for row in reader:
print(row)
سادهترین مثال ممکن برای نوشتن، متناظر با آن، به این صورت است:
import csv
with open('some.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(someiterable)
از آنجا که open() برای باز کردن یک پرونده CSV جهت خواندن استفاده میشود، پرونده بهطور پیشفرض با استفاده از کدگذاری پیشفرض سیستم به یونیکد کدگشایی میشود (به locale.getencoding() مراجعه کنید). برای کدگشایی یک پرونده با کدگذاری متفاوت، از آرگومان encoding در open استفاده کنید:
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
همین امر در مورد نوشتن با کدگذاری غیر از کدگذاری پیشفرض سیستم نیز صدق میکند: هنگام باز کردن پرونده خروجی، آرگومان encoding را مشخص کنید.
ثبت یک گویش جدید:
import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='') as f:
reader = csv.reader(f, 'unixpwd')
یک کاربرد کمی پیشرفتهتر از reader --- گرفتن و گزارش خطاها:
import csv, sys
filename = 'some.csv'
with open(filename, newline='') as f:
reader = csv.reader(f)
try:
for row in reader:
print(row)
except csv.Error as e:
sys.exit(f'file {filename}, line {reader.line_num}: {e}')
و با وجود اینکه ماژول مستقیماً از تجزیهی رشتهها پشتیبانی نمیکند، این کار بهراحتی قابل انجام است:
import csv
for row in csv.reader(['one,two,three']):
print(row)
پانویسها