كتاب "بيثون. اكسبرس بالطبع. 3rd ed.

الصورة مرحبا ، habrozhiteli! هذا الكتاب مخصص للأشخاص الذين لديهم بالفعل خبرة بلغة واحدة أو أكثر من لغات البرمجة ويريدون تعلم أساسيات Python 3. بأسرع ما يمكن وبسهولة ممكنة ، ويُفترض أن يكون القارئ معتادًا بالفعل على هياكل التحكم و OOP ومعالجة الملفات ومعالجة الاستثناءات ، إلخ. ه. سيكون الكتاب مفيدًا أيضًا لمستخدمي الإصدارات السابقة من Python الذين يحتاجون إلى مرجع Python 3.1 مضغوط.

نحن ندعوك لقراءة مقتطفات "معالجة ملفات البيانات"

كيفية استخدام الكتاب


الجزء 1 يوفر معلومات عامة عن بيثون. سوف تتعلم كيفية تنزيل Python وتثبيته على نظامك. كما يوفر نظرة عامة حول اللغة ، والتي ستكون مفيدة في المقام الأول للمبرمجين ذوي الخبرة الذين يريدون فهم رفيع المستوى لبيثون.

الجزء 2 يحتوي على المادة الرئيسية للكتاب. يناقش المكونات الضرورية لاكتساب المهارات العملية في استخدام Python كلغة برمجة للأغراض العامة. تم التخطيط لمواد الفصول بحيث يتمكن القراء الذين بدأوا للتو في تعلم بيثون من التقدم للأمام بالتسلسل ، وإتقان النقاط الرئيسية للغة. يحتوي هذا الجزء أيضًا على أقسام أكثر تعقيدًا ، حتى تتمكن من العودة والعثور على جميع المعلومات اللازمة حول تصميم أو موضوع معين في مكان واحد.

يقدم الجزء 3 الميزات المتقدمة لعناصر لغة بيثون التي ليست ضرورية للغاية ، ولكنها بالتأكيد ستكون مفيدة لأي مبرمج بيثون جاد.

يركز الجزء 4 على مواضيع متخصصة تتجاوز بناء الجملة البسيط للغة. يمكنك قراءة هذه الفصول أو تخطيها حسب احتياجاتك.

يتم تشجيع المبرمجين المبتدئين في Python على البدء بالفصل 3 للحصول على انطباع عام ، ثم الانتقال إلى فصول الاهتمام في الجزء 2. تقديم أمثلة تفاعلية لتفعيل المفاهيم. يمكنك أيضًا تجاوز الأمثلة الواردة في النص والبحث عن إجابات لأي أسئلة لا تزال غير واضحة. هذا النهج سوف يزيد من سرعة التعلم وتعميق الفهم. إذا لم تكن معتادًا بالفعل على OOP أو لم يكن مطلوبًا للتطبيق الخاص بك ، يمكنك تخطي معظم الفصل 15.

يجب أن يبدأ القراء المألوفون بالفعل بـ Python بالفصل 3. ويوفر نظرة عامة تمهيدية جيدة ووصفًا للاختلافات بين Python 3 والإصدارات الأكثر دراية. يمكن استخدامه أيضًا لتقييم ما إذا كنت مستعدًا للانتقال إلى الفصول الأكثر تعقيدًا من الجزأين 3 و 4 من هذا الكتاب.

ربما يتمكن بعض القراء الذين ليس لديهم خبرة في بيثون ولكن لديهم خبرة كافية في لغات البرمجة الأخرى من الحصول على معظم المعلومات الضرورية من خلال قراءة الفصل 3 والنظر إلى وحدات مكتبة بيثون القياسية (الفصل 19) ودليل مرجعي لمكتبة بيثون في وثائق بيثون .

مقتطفات. معالجة ملفات البيانات


يتم توزيع معظم البيانات في ملفات نصية. يمكن أن يكون هذا إما نصًا غير منظم (على سبيل المثال ، مجموعة من الرسائل أو مجموعة من النصوص الأدبية) ، أو بيانات أكثر تنظيماً ، يكون كل سطر فيها سجلًا ، وتكون الحقول مفصولة بحرف فاصل خاص - فاصلة أو حرف علامة تبويب أو شريط عمودي (|). الملفات النصية يمكن أن تكون ضخمة. يمكن أن تشغل مجموعة البيانات عشرات أو حتى مئات الملفات ، وقد تكون البيانات الموجودة فيها غير كاملة أو مشوهة. مع مثل هذا التنوع ، ستصادف حتما مهمة قراءة واستخدام البيانات من الملفات النصية. يقدم هذا الفصل الاستراتيجيات الأساسية لحل هذه المشكلة في بيثون.

21.1. تقديم ETL


الحاجة إلى استخراج البيانات من الملفات ، وتحليلها ، وتحويلها إلى تنسيق مناسب ، ثم القيام بشيء ما في وقت واحد تقريبًا مع ملفات البيانات. علاوة على ذلك ، هناك حتى مصطلح قياسي لهذه العملية: ETL (Extract-Transform-Load ، أي "استخراج - تحويل - تحميل"). يشير الاسترجاع إلى عملية قراءة مصدر البيانات وتحليله إذا لزم الأمر. قد يتضمن التحويل تنظيف البيانات وتطبيعها ، بالإضافة إلى دمج السجلات التي تحتوي عليها وتقسيمها وإعادة تنظيمها. أخيرًا ، يعني التحميل حفظ البيانات المحولة في مكان جديد (في ملف أو قاعدة بيانات أخرى). يناقش هذا الفصل أساسيات تطبيق ETL في Python ، من ملفات البيانات النصية إلى تخزين البيانات المحولة في ملفات أخرى. تتم مناقشة ملفات البيانات الأكثر تنظيمًا في الفصل 22 ، وتناقش تخزين المعلومات في قاعدة بيانات في الفصل 23.

21.2. قراءة الملفات النصية


يتضمن المكون الأول من ETL - الاستخراج - فتح ملف وقراءة محتوياته. للوهلة الأولى ، يبدو الأمر بسيطًا ، ولكن حتى هنا قد تنشأ مشاكل - على سبيل المثال ، حجم الملف. إذا كان الملف كبيرًا جدًا بحيث لا يمكن احتواؤه في الذاكرة ، فيجب أن يكون الرمز منظمًا بحيث يعمل مع شرائح أصغر من الملف (ربما سطر واحد).

21.2.1. ترميز النص: ASCII و Unicode وغيرها


مشكلة محتملة أخرى هي الترميز. هذا الفصل مخصص للعمل مع الملفات النصية ، وفي الواقع ، يتم تخزين نسبة كبيرة من البيانات المرسلة في العالم الحقيقي في ملفات نصية. ومع ذلك ، قد تختلف الطبيعة الدقيقة للنص بناءً على التطبيق والمستخدم وبالطبع البلد.

في بعض الأحيان يحمل النص معلومات في ترميز ASCII ، بما في ذلك 128 حرفًا ، 95 فقط منها مصنفة على أنها قابلة للطباعة. لحسن الحظ ، يعد ترميز ASCII هو "المضاعف الأقل شيوعًا" لمعظم حالات نقل البيانات. من ناحية أخرى ، لا يمكنها التعامل مع تعقيدات العديد من الحروف الهجائية وأنظمة الكتابة الموجودة في العالم. من المؤكد أن قراءة الملفات في تشفير ASCII ستؤدي إلى حقيقة أنه عند قراءة الأحرف غير المدعومة ، سواء كانت الألمانية ü أو البرتغالية ç أو أي حرف تقريبًا من لغة أخرى غير الإنجليزية ، فستبدأ المشاكل وستظهر الأخطاء.

تحدث هذه الأخطاء لأن ASCII يستخدم قيم 7 بت ، بينما تتكون البايتات في ملف نموذجي من 8 بتات ، مما يسمح بتمثيل 256 قيمة ممكنة بدلاً من 128 لقيم 7 بت. تُستخدم هذه الرموز الإضافية عادةً لتخزين قيم إضافية - بدءًا من علامات الترقيم الموسعة (مثل الشرطات المتوسطة والقصيرة) إلى مختلف الشخصيات (العلامة التجارية وعلامة حقوق النشر وعلامة الدرجة) وإصدارات الأحرف الأبجدية ذات علامات التشكيل. كانت هناك دائمًا مشكلة واحدة: عند قراءة ملف نصي ، قد تواجه حرفًا يتجاوز نطاق ASCII الذي يتكون من 128 حرفًا ، ولا يمكنك التأكد من الحرف الذي تم ترميزه. لنفترض أنك صادفت شخصية برمز 214. ما هذا؟ علامة تقسيم ، الحرف Ö أو أي شيء آخر؟ بدون الشفرة المصدرية التي أنشأت هذا الملف ، من المستحيل معرفة ذلك.

يونيكود و UTF-8


للتخلص من هذا الغموض ، يمكنك استخدام Unicode. يدعم تشفير Unicode ، المسمى UTF-8 ، أحرف ASCII الأساسية دون أي تغييرات ، ولكنه يسمح أيضًا بمجموعة غير محدودة تقريبًا من الشخصيات والأحرف الأخرى من Unicode القياسي. نظرًا لمرونتها ، يتم استخدام UTF-8 في أكثر من 85٪ من صفحات الويب التي كانت موجودة وقت كتابة هذا التقرير. هذا يعني أنه عند قراءة الملفات النصية ، من الأفضل التركيز على UTF-8. إذا كانت الملفات تحتوي على أحرف ASCII فقط ، فستتم قراءتها بشكل صحيح ، ولكن يمكنك أيضًا الحصول على تأمين في حالة ترميز أحرف أخرى في UTF-8. لحسن الحظ ، تم تصميم نوع بيانات سلسلة Python 3 لدعم Unicode افتراضيًا.

حتى مع Unicode ، تكون المواقف ممكنة عندما تظهر القيم في النص والتي لا يمكن فك تشفيرها بنجاح. تتلقى الوظيفة المفتوحة في Python معلمة أخطاء إضافية ، والتي تحدد كيفية التعامل مع أخطاء الترميز عند قراءة أو كتابة الملفات. القيمة الافتراضية هي "صارمة" ، حيث يتم تشغيل خطأ في كل مرة يتم فيها اكتشاف خطأ ترميز. القيم الأخرى المفيدة هي "تجاهل" (تخطي الحرف الذي تسبب في الخطأ) ؛ "استبدال" (يتم استبدال حرف بعلامة خاصة - عادة؟) ؛ "backslashreplace" (يتم استبدال الحرف بسلسلة الهروب بـ \) و "surrogateescape" (يتم تحويل حرف الدخيل إلى نقطة كود Unicode خاصة عند القراءة والعودة إلى تسلسل البايت الأصلي عند الكتابة). يعتمد اختيار طريقة معالجة أخطاء الترميز أو حلها على الموقف المحدد.

فكر في مثال قصير لملف يحتوي على حرف UTF-8 غير صالح ، وانظر كيف تتم معالجة هذا الحرف في أوضاع مختلفة. أولاً اكتب الملف باستخدام البايتات والوضع الثنائي:

>>> open('test.txt', 'wb').write(bytes([65, 66, 67, 255, 192,193])) 

نتيجة للأمر ، يتم إنشاء ملف من الأحرف "ABC" ، متبوعًا بثلاثة أحرف غير مدرجة في ASCII ، والتي يمكن عرضها بشكل مختلف وفقًا لطريقة الترميز المستخدمة. إذا كنت تستخدم vim لعرض الملف ، فستظهر النتيجة بالشكل التالي:

 ABCÿÀÁ ~ 


عند إنشاء الملف ، حاول قراءته في الوضع الافتراضي لمعالجة الأخطاء الصارمة:

 >>> x = open('test.txt').read() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.6/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte 


البايت الرابع بقيمة 255 ليس حرف UTF-8 صالح في هذا الموضع ، لذلك يحدث استثناء في الوضع "الصارم". الآن ، لنرى كيف تتعامل أوضاع معالجة الأخطاء الأخرى مع نفس الملف ، دون أن ننسى أن الأحرف الثلاثة الأخيرة تتسبب في حدوث خطأ:

الصورة

إذا كنت تريد أن تختفي الأحرف المشكّلة ، استخدم وضع "التجاهل". يضع وضع "استبدال" علامات مواقف الأحرف غير الصالحة فقط ، في حين أن الأوضاع الأخرى تحاول بشكل مختلف حفظ الأحرف غير الصالحة دون تفسير.

21.2.2. نص غير منظم


تتم قراءة الملفات النصية غير المهيكلة الأسهل ، ولكنها تخلق أيضًا معظم المشكلات في استخراج المعلومات. يمكن أن تختلف معالجة النص غير المهيكل اختلافًا كبيرًا وفقًا لطبيعة النص وما ستفعله به ، لذلك فإن أي مناقشة تفصيلية لمعالجة النص تتجاوز نطاق الكتاب. ومع ذلك ، سيساعد مثال قصير على توضيح بعض المشكلات الأساسية ويضع الأساس لمناقشة الملفات مع بيانات نصية منظمة.

إحدى أبسط المشكلات هي اختيار الوحدة المنطقية الأساسية في الملف. إذا كنت تستخدم مجموعة من آلاف رسائل Twitter أو نص Moby Dick أو مجموعة من الأخبار ، فأنت بحاجة إلى تقسيمها بطريقة ما إلى مجموعات. في حالة التغريدات ، يمكن وضع كل كتلة في سطر واحد ، ويتم تنظيم قراءة ومعالجة كل سطر من الملف ببساطة شديدة.

في حالة Moby Dick وحتى بعض الأخبار ، فإن المشكلة تزداد تعقيدًا. بطبيعة الحال ، نص الرواية وحتى نص الخبر عادة ما يكون غير مرغوب فيه للنظر فيه كوحدة واحدة. في هذه الحالة ، تحتاج إلى تحديد الكتل التي تحتاج إليها ، ثم تطوير استراتيجية لتقسيم الملف إلى كتل. قد تفضل معالجة النص فقرة فقرة. في هذه الحالة ، يجب عليك تحديد كيفية تنظيم تقسيم النص إلى فقرات في الملف ، واكتب الرمز وفقًا لذلك. إذا كانت الفقرات تتطابق مع سطور الملف النصي ، فلن يكون هذا صعبًا. ومع ذلك ، غالبًا ما يمكن أن تتكون فقرة واحدة من ملف نصي من عدة أسطر في ملف نصي ، وسيكون عليك العمل بجد.

الآن النظر في بعض الأمثلة.

اتصل بي إسماعيل. منذ بضع سنوات - لا يهمك كم من الوقت بدقة -
امتلاك القليل من المال أو عدمه في حقيبتي ، ولا شيء خاص
لمصلحة لي على الشاطئ ، وأعتقد أنني سوف تبحر قليلا
وانظر الجزء المائي من العالم. إنها طريقة لدي
القيادة على الطحال وتنظيم الدورة الدموية.
كلما أجد نفسي قاتمة حول الفم ؛
كلما كانت رطبة ورطبة في نوفمبر ؛ كلما أنا
أجد نفسي متوقفًا مؤقتًا قبل مستودعات التابوت ،
وتربية الجزء الخلفي من كل جنازة أقابلها ؛
وخاصة عندما يحصل قصور الغدة الدرقية لي على اليد العليا ،
أنه يتطلب مبدأ أخلاقيا قويا لمنعني من
يخطو عمدا في الشارع ، ويطرق منهجية
القبعات الناس قبالة - ثم ، أنا حساب الوقت قد حان للوصول إلى البحر
بأسرع ما يمكن. هذا هو بديلي عن المسدس والكرة.
مع ازدهار فلسفي يرمي كاتو نفسه على سيفه.
أنا أخذ بهدوء إلى السفينة. لا يوجد شيء يثير الدهشة في هذا.
إذا كانوا يعرفون ذلك ، فكلهم تقريباً رجال في شهادتهم ، بعض الوقت
أو غيرها ، نعتز به تقريبا نفس المشاعر تجاه
المحيط معي.

هناك الآن مدينتك المعزولة في مانهاتوس ، مربوطة بالرواسب
كجزر هندية من الشعاب المرجانية - التجارة تحيط بها مع تصفحها.
اليمين واليسار ، تأخذك الشوارع نحو الماء. في وسط المدينة المدقع
هي البطارية ، حيث يتم غسل هذا الخلد النبيل بالموجات ، وتبريده
بواسطة النسائم ، والتي كانت قبل ساعات قليلة بعيدا عن الأنظار من الأرض.
إلقاء نظرة على حشود من gazers هناك.

في هذا المثال (مع بداية النص "Moby Dick") ، يتم تقسيم الأسطر بشكل أو بآخر بالطريقة التي سيتم بها ترقيم الصفحات ، ويتم الإشارة إلى الفقرات بسطر فارغ واحد. إذا كنت تريد التعامل مع كل فقرة ككل ، فأنت بحاجة إلى تقسيم النص إلى أسطر فارغة. لحسن الحظ ، يتم إنجاز هذه المهمة بسهولة عن طريق طريقة تقسيم السلاسل (). يتم تمثيل كل سطر جديد في النص بالجمع "\ n". من الطبيعي أن ينتهي السطر الأخير من كل فقرة بسطر جديد ، وإذا كان السطر التالي من النص فارغًا ، فإن السطر الثاني الجديد يتبعه مباشرة:

الصورة

يعتبر تحليل النص في الفقرات خطوة بسيطة للغاية في معالجة النص غير المنظم. قد تحتاج أيضًا إلى إجراء تطبيع إضافي للنص قبل المعالجة الإضافية. افترض أنك تريد حساب تكرار حدوث كل كلمة في ملف نصي. إذا قمت ببساطة بتقسيم الملف عن طريق الإغفال ، فستحصل على قائمة بالكلمات في الملف ، ومع ذلك ، فإن حساب التكرارات بدقة لن يكون بهذه البساطة لأن هذا ، هذا ، هذا. وهذا ، لن يعتبر نفس الكلمة. لكي يعمل هذا الرمز بشكل صحيح ، من الضروري تطبيع النص عن طريق إزالة علامات الترقيم وتحويل النص بالكامل إلى حالة واحدة قبل المعالجة. في مثال النص أعلاه ، قد يبدو رمز إنشاء قائمة بالكلمات طبيعية:

الصورة

21.2.3. ملفات محددة غير منظمة


تتم قراءة الملفات غير المهيكلة بكل بساطة ، ولكن عدم وجود هيكل هو أيضًا عيبها. غالبًا ما يكون تحديد بنية بعض الملفات أكثر ملاءمةً لتبسيط عملية اختيار القيم الفردية. في أبسط إصدار ، يتم تقسيم الملف إلى خطوط ، ويحتوي كل سطر على عنصر معلومات واحد. على سبيل المثال ، يمكن أن تكون قائمة بأسماء الملفات للمعالجة ، أو قائمة بأسماء الأشخاص أو سلسلة من قراءات درجة الحرارة من جهاز استشعار عن بعد. في مثل هذه الحالات ، يتم تنظيم تحليل البيانات بكل بساطة: يمكنك قراءة السطر ، وإذا لزم الأمر ، قم بتحويله إلى النوع المطلوب. هذا هو كل ما يتطلبه الأمر لإعداد الملف للاستخدام.

ومع ذلك ، فإن الوضع ليس بهذه البساطة. في أغلب الأحيان تحتاج إلى تجميع العديد من عناصر البيانات المترابطة ، ويجب أن يقرأها الكود معًا. عادةً ما يتم وضع البيانات ذات الصلة في سطر واحد مفصولة بحرف خاص. في هذه الحالة ، عند قراءة كل سطر من الملف ، يتم استخدام أحرف خاصة لتقسيم البيانات إلى حقول وتخزين قيم الحقول في متغيرات للمعالجة الإضافية.

يحتوي الملف التالي على بيانات درجة الحرارة بتنسيق محدد:

 State|Month Day, Year Code|Avg Daily Max Air Temperature (F)|Record Count for Daily Max Air Temp (F) Illinois|1979/01/01|17.48|994 Illinois|1979/01/02|4.64|994 Illinois|1979/01/03|11.05|994 Illinois|1979/01/04|9.51|994 Illinois|1979/05/15|68.42|994 Illinois|1979/05/16|70.29|994 Illinois|1979/05/17|75.34|994 Illinois|1979/05/18|79.13|994 Illinois|1979/05/19|74.94|994 

يتم فصل البيانات الموجودة في الملف بواسطة توجيه الإخراج (|). في هذا المثال ، تتكون من أربعة حقول: الحالة ، تاريخ المراقبة ، متوسط ​​درجة الحرارة القصوى وعدد المحطات التي توفر البيانات. المحددات القياسية الأخرى هي حرف جدولة وفاصلة. ربما يتم استخدام الفاصلة في معظم الأحيان ، ولكن يمكن أن يكون الفاصل أي حرف لن يحدث في القيم (أكثر على ذلك لاحقًا). البيانات المفصولة بفواصل شائعة جدًا لدرجة أن هذا التنسيق يُسمى غالبًا CSV (القيم المفصولة بفواصل ، أي البيانات المفصولة بفواصل) ، ويتم توفير هذا النوع من الملفات بامتداد .csv كسمة تنسيق.

أيا كان الطابع المستخدم كمحدد ، إذا كنت تعرف ماهية الشخصية ، فيمكنك كتابة رمز Python الخاص بك لتقسيم السلسلة إلى حقول وإعادتها كقائمة. في الحالة السابقة ، يمكنك استخدام الأسلوب split () لتحويل السلسلة إلى قائمة القيم:

 >>> line = "Illinois|1979/01/01|17.48|994" >>> print(line.split("|")) ['Illinois', '1979/01/01', '17.48', '994'] 

هذه التقنية سهلة التنفيذ ، ولكن يتم تخزين جميع القيم في شكل سلسلة ، وقد يكون هذا غير مريح للمعالجة اللاحقة.

21.2.4. وحدة CSV


إذا كان عليك غالبًا معالجة ملفات البيانات المحددة ، فعليك إلقاء نظرة فاحصة على وحدة CSV وقدراتها. عندما طُلب مني تسمية الوحدة النمطية المفضلة لدي من مكتبة Python القياسية ، اتصلت بالوحدة النمطية csv أكثر من مرة - ليس لأنها تبدو مذهلة (ليست كذلك) ، ولكن لأنها ربما وفرت لي المزيد من الوقت وحفظتني من أخطائي المحتملة في كثير من الأحيان أكثر من أي وحدة أخرى.
وحدة CSV هي مثال مثالي لفلسفة بيثون "المشمولة بالبطارية". على الرغم من أنه يمكنك كتابة التعليمات البرمجية الخاصة بك تمامًا لقراءة الملفات المحددة (علاوة على ذلك ، فهي ليست صعبة للغاية) ، إلا أنه من الأسهل والأكثر موثوقية استخدام وحدة Python. تم اختبار وحدة csv وتحسينها ، وهي توفر عددًا من الميزات التي بالكاد تكون قادرًا على تنفيذها بنفسك ، ولكنها مع ذلك مريحة للغاية وتوفر الوقت.

ألقِ نظرة على البيانات السابقة وحدد كيفية قراءتها باستخدام وحدة CSV. يجب أن يقوم رمز تحليل البيانات بقراءة كل سطر وإزالة حرف السطر الجديد ، ثم تقسيم السطر على أحرف | وإلحاق قائمة القيم إلى قائمة السلاسل العامة. قد يبدو الحل كالتالي:

 >>> results = [] >>> for line in open("temp_data_pipes_00a.txt"): ... fields = line.strip().split("|") ... results.append(fields) ... >>> results [['State', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)'], ['Illinois', '1979/01/01', '17.48', '994'], ['Illinois', '1979/01/02', '4.64', '994'], ['Illinois', '1979/01/03', '11.05', '994'], ['Illinois', '1979/01/04', '9.51', '994'], ['Illinois', '1979/05/15', '68.42', '994'], ['Illinois', '1979/ 05/16', '70.29', '994'], ['Illinois', '1979/05/17', '75.34', '994'], ['Illinois', '1979/05/18', '79.13', '994'], ['Illinois', '1979/05/19', '74.94', '994']] 

إذا كنت تريد أن تفعل الشيء نفسه مع وحدة CSV ، فقد تبدو الكود مثل هذا:

 >>> import csv >>> results = [fields for fields in csv.reader(open("temp_data_pipes_00a.txt", newline=''), delimiter="|")] >>> results [['State', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)'], ['Illinois', '1979/01/01', '17.48', '994'], ['Illinois', '1979/01/02', '4.64', '994'], ['Illinois', '1979/01/03', '11.05', '994'], ['Illinois', '1979/01/04', '9.51', '994'], ['Illinois', '1979/05/15', '68.42', '994'], ['Illinois', '1979/ 05/16', '70.29', '994'], ['Illinois', '1979/05/17', '75.34', '994'], ['Illinois', '1979/05/18', '79.13', '994'], ['Illinois', '1979/05/19', '74.94', '994']] 

في هذه الحالة البسيطة ، فإن المكسب مقارنة بالتنفيذ المستقل للحل ليس كبيرًا. ومع ذلك ، فقد تحولت الكود إلى سطرين أقصر وأقل وضوحًا ، ولا داعي للقلق بشأن اقتطاع أحرف السطر الجديد. الميزة الحقيقية تأتي عندما تواجه حالات أكثر تعقيدًا.

البيانات في هذا المثال حقيقية ، ولكن في الواقع تم تبسيطها ومسحها. ستكون البيانات الحقيقية من المصدر أكثر تعقيدًا. تحتوي البيانات الحقيقية على المزيد من الحقول ، وسيتم إرفاق بعض الحقول بعلامات اقتباس ، والبعض الآخر لا ، وقد يكون الحقل الأول فارغًا. يتم فصل النص الأصلي بعلامات جدولة ، لكن لأغراض العرض التوضيحي ، أقتبس منهم مفصولة بفواصل:

 "Notes","State","State Code","Month Day, Year","Month Day, Year Code",Avg Daily Max Air Temperature (F),Record Count for Daily Max Air Temp (F),Min Temp for Daily Max Air Temp (F),Max Temp for Daily Max Air Temp (F),Avg Daily Max Heat Index (F),Record Count for Daily Max Heat Index (F),Min for Daily Max Heat Index (F),Max for Daily Max Heat Index (F),Daily Max Heat Index (F) % Coverage ,"Illinois","17","Jan 01, 1979","1979/01/ 01",17.48,994,6.00,30.50,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 02, 1979","1979/01/02",4.64,994,- 6.40,15.80,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 03, 1979","1979/01/03",11.05,994,- 0.70,24.70,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 04, 1979","1979/01/ 04",9.51,994,0.20,27.60,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 15, 1979","1979/05/ 15",68.42,994,61.00,75.10,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 16, 1979","1979/05/ 16",70.29,994,63.40,73.50,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 17, 1979","1979/05/ 17",75.34,994,64.00,80.50,82.60,2,82.40,82.80,0.20% ,"Illinois","17","May 18, 1979","1979/05/ 18",79.13,994,75.50,82.10,81.42,349,80.20,83.40,35.11% ,"Illinois","17","May 19, 1979","1979/05/ 19",74.94,994,66.90,83.10,82.87,78,81.60,85.20,7.85% 

يرجى ملاحظة: بعض الحقول تشمل فواصل. وفقًا للقواعد في مثل هذه الحالات ، يتم إرفاق الحقل بعلامات اقتباس للإشارة إلى أن محتوياته لا تهدف إلى تحليل المحددات والبحث عنها. في الممارسة العملية (كما في هذه الحالة) ، غالبًا ما تتضمن علامات الاقتباس جزءًا صغيرًا فقط من الحقول ، خاصة تلك التي قد تحتوي قيمها على فاصل. ومع ذلك (كما هو الحال مرة أخرى في هذا المثال) ، يتم تضمين بعض الحقول بعلامات اقتباس حتى إذا كان من غير المحتمل أن تحتوي على فاصل.

في مثل هذه الحالات ، تصبح الحلول المحلية مرهقة للغاية. الآن مجرد كسر سطر بحرف محدد لم يعد يعمل ؛ تحتاج إلى التأكد من أنك تستخدم فقط تلك الفواصل غير الموجودة في الأوتار. بالإضافة إلى ذلك ، يجب عليك إزالة علامات الاقتباس ، والتي قد تكون في وضع تعسفي أو غير موجودة في أي مكان. باستخدام وحدة CSV ، لن تحتاج إلى تغيير الكود على الإطلاق. علاوة على ذلك ، نظرًا لأن الفاصلة تعتبر الفاصل الافتراضي ، فلا يلزم حتى تحديدها:

 >>> results2 = [fields for fields in csv.reader(open("temp_data_01.csv", newline=''))] >>> results2 [['Notes', 'State', 'State Code', 'Month Day, Year', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)', 'Min Temp for Daily Max Air Temp (F)', 'Max Temp for Daily Max Air Temp (F)', 'Avg Daily Min Air Temperature (F)', 'Record Count for Daily Min Air Temp (F)', 'Min Temp for Daily Min Air Temp (F)', 'Max Temp for Daily Min Air Temp (F)', 'Avg Daily Max Heat Index (F)', 'Record Count for Daily Max Heat Index (F)', 'Min for Daily Max Heat Index (F)', 'Max for Daily Max Heat Index (F)', 'Daily Max Heat Index (F) % Coverage'], ['', 'Illinois', '17', 'Jan 01, 1979', '1979/01/01', '17.48', '994', '6.00', '30.50', '2.89', '994', '-13.60', '15.80', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 02, 1979', '1979/01/02', '4.64', '994', '-6.40', '15.80', '-9.03', '994', '-23.60', '6.60', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 03, 1979', '1979/01/03', '11.05', '994', '- 0.70', '24.70', '-2.17', '994', '-18.30', '12.90', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 04, 1979', '1979/01/04', '9.51', '994', '0.20', '27.60', '-0.43', '994', '-16.30', '16.30', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 15, 1979', '1979/05/15', '68.42', '994', '61.00', '75.10', '51.30', '994', '43.30', '57.00', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 16, 1979', '1979/05/ 16', '70.29', '994', '63.40', '73.50', '48.09', '994', '41.10', '53.00', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 17, 1979', '1979/05/17', '75.34', '994', '64.00', '80.50', '50.84', '994', '44.30', '55.70', '82.60', '2', '82.40', '82.80', '0.20%'], ['', 'Illinois', '17', 'May 18, 1979', '1979/05/18', '79.13', '994', '75.50', '82.10', '55.68', '994', '50.00', '61.10', '81.42', '349', '80.20', '83.40', '35.11%'], ['', 'Illinois', '17', 'May 19, 1979', '1979/05/19', '74.94', '994', '66.90', '83.10', '58.59', '994', '50.90', '63.20', '82.87', '78', '81.60', '85.20', '7.85%']] 


»يمكن الاطلاع على مزيد من المعلومات حول الكتاب على موقع الناشر
» المحتويات
» مقتطفات

20 ٪ من القسيمة للباعة المتجولين - بيثون

Source: https://habr.com/ru/post/ar437050/


All Articles