أكثر

برمجة Python لفئات الميزات (حلقة ، فرز ، دمج ، واستبدال)


هذا ما يجب أن أقوم بإنجازه باستخدام برنامج نصي بيثون لـ ArcGIS 10.1:

  1. قم بالتكرار خلال جميع فئات المعالم وأضف حقلاً أولاً ، ثم اكتب اسم فئة المعلم في الحقل المضاف.
  2. دمج جميع فئات الميزات من 1. في فئة ميزة واحدة تسمى OSRS_ORN_NER.
  3. قم بفرز فئة الميزة هذه حسب HWY_NUM واستبدل OSRS_ORN_NER بالفئة التي تم فرزها.

هذا هو الكود الذي لدي لذلك حتى الآن:

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

الشفرة:

import arcpy، os arcpy.env.workspace = r'W:  S&P  s & p techs  Emily  TownshipsDissolved  FinalDissolved.gdb '# Looping عبر فئات الميزات التي تم حلها وإضافة حقل "الاسم" وكتابة # اسم فئة الميزة في الحقل المضاف . لـ fc في arcpy.ListFeatureClasses (): arcpy.AddField_management (fc، "Name"، "TEXT"، field_length = 50) مع arcpy.da.UpdateCursor (fc، "Name") كمؤشر: للصف في المؤشر: الصف [ 0] = fc cursor.updateRow (row) # دمج فئات الميزات المتعددة في واحدة تسمى OSRS_ORN_NER list = [] لـ r في الصف: list.append (r) arcpy.Merge_management (list، "W:  S&P  s & p techs  Emily  TownshipsDissolved  FinalDissolved.gdb  OSRS_ORN_NER ") # الفرز حسب HWY_NUM_PR واستبدال OSRS_ORN_NER بفئة الميزة التي تم فرزها Sort_management (" OSRS_ORN_NER "،" OSRS_ORN_NER_new "، [[" HWY_NUM_ING ")

تحتاج أولاً إلى تعيينقائمةالميزاتإلى متغير حتى تتمكن من تسميته لاحقًا للدمج

import arcpy، os arcpy.env.workspace = r'W:  S&P  s & p techs  Emily  TownshipsDissolved  FinalDissolved.gdb 'fcs = arcpy.ListFeatureClasses () for fc in fcs: arcpy.AddField_management (fc، "Name"، "TEXT"، field_length = 50) مع arcpy.da.UpdateCursor (fc، "Name") كمؤشر: للصف في المؤشر: row [0] = fc cursor.updateRow (row) mergeOutput = r "W:  S&P  s & p techs  Emily  TownshipsDissolved  FinalDissolved.gdb  OSRS_ORN_NER "sortOutput = r" W:  S&P  s & p techs  Emily  TownshipsDissolved  FinalDissolved.gdb  OSRS_ORN_NER_new "arcpy.Merge_managementO (futcs) ، [["HWY_NUM_PR"، "ASCENDING"]])

يبدو جيدًا تمامًا ، ولكن يجب عليك تهيئة قائمتك قبل إجراء التكرار على fc ، وإضافة مسافة بادئة بشكل صحيح لإلحاق أسماء fc بقائمتك

لـ fc في arcpy.ListFeatureClasses (): list.append (fc) ... arcpy.Merge_management (list، outputname) arcpy.Sort_management (outputname، finalname، [["HWY_NUM_PR"، "ASCENDING"]])

كيف يمكنني معرفة مكان تعليق نص Python الخاص بي؟

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


ماذا نسمي تجريف الويب؟

تجريف الويب هو عملية آلية لجمع البيانات العامة. تقوم برامج كاشط الويب تلقائيًا باستخراج كميات كبيرة من البيانات العامة من مواقع الويب المستهدفة في ثوانٍ.

سيعمل هذا البرنامج التعليمي لتخليص الويب من Python مع جميع أنظمة التشغيل. ستكون هناك اختلافات طفيفة عند تثبيت Python أو بيئات التطوير ولكن ليس في أي شيء آخر.

  • بناء مكشطة الويب: Python prepwork
  • الوصول إلى المكتبات
  • WebDrivers والمتصفحات
  • العثور على مكان مريح لمكشطة الويب Python الخاصة بنا
  • استيراد واستخدام المكتبات
  • اختيار عنوان URL
  • تحديد الكائنات وقوائم البناء
  • استخراج البيانات باستخدام مكشطة الويب Python الخاصة بنا
  • تصدير البيانات
  • المزيد من القوائم. أكثر!
  • تجريف الويب باستخدام أفضل ممارسات Python
  • استنتاج

ما أقسام Python التي يجب أن أتعلمها من أجل ArcGis؟

أريد أن أتعلم لغة python for ArcGis. لقد اشتريت & quotA أتمتة الأشياء المملة باستخدام الثعبان. & quot؛ إنه & # x27s كتاب ممتع ، لكنه & # x27s كبير! ما الأقسام / الكود الذي يجب علي التركيز عليه عند تعلم Python for ArcGis؟ على سبيل المثال ، هل يجب أن أركز على & quot while & quot loop وما إلى ذلك؟ شكرا!

يجب أن تعمل من خلال الكتاب بأكمله. لا يستغرق الأمر وقتًا طويلاً على الإطلاق. إنه & # x27s حيث بدأت وفعل كل شيء سيمنحك أساسًا جيدًا قبل الدخول في Python لـ GIS.

هل هذا كتاب تنصحني بالحصول عليه؟ لقد عملت R من قبل ، أعرف كيفية القيام ببعض إجراءات الاستعلام الأساسية: p وهذا & # x27s.

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

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

الكثير من وظائف نظم المعلومات الجغرافية (مثل تشغيل أدوات المعالجة الجغرافية) التي تحتاجها & # x27ll مع Arcpy خاصة بـ esri إلى حد كبير ، لذلك عند تعلم لغة بيثون غير GIS ، تكون في الغالب فهمًا أساسيًا لهيكل البرنامج النصي (متغيرات الإعداد ، بناء الجملة ، استيراد المكتبات ، إلخ ..) وتعلم تكرار الأشياء ، مثل التكرار عبر مجلد من الملفات.

الابتعاد عن Arcpy في اسرع وقت ممكن. هناك عالم ضخم من الأدوات والخيارات المتاحة.

أعتقد & quotthe الأساسيات & quot هي الفصول 1-10. لكنني سأستمر بعد ذلك. الكتاب كله جيد

أنواع البيانات مهمة وطرق التحقق منها وتلخيصها.

Zip للتكرار على عدة عناصر في نفس الوقت

قائمة الفهم خاصة لبناء سلاسل مخصصة

ثم اكتشف كيف أن توثيق Arcgis مفيد تمامًا الآن مع Arcpy

ثم جوجل مشكلتك مع site: stackexchange.com للحصول على أمثلة ، توضيحات وملاحظات جانبية حول مشكلتك ، والتعلم.

أعد استخدام الكود الخاص بك. احفظ نسخة قبل إجراء تغييرات مهمة.

بمجرد أن تسير الأمور على ما يرام ، يمكنك إلقاء نظرة على بيئات كوندا أو بيئات افتراضية لتقديم تحليل مثير للغاية ، وتعلم إحصائي ، ورسومات ، ومكتبات تحويل البيانات.

بما في ذلك دفتر jupyter ، والذي يسمح باختبار الكود السهل والتوثيق الذاتي ، حتى للمبتدئين.

في أي وقت على طول الطريق أو بعد أن يكون لديك الوقت والاهتمام ، اقرأ كتابًا واعمل عليه بقدر ما تستطيع. أوصي بتعلم Python بواسطة OReilly Press.


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

10 استخدامات مهمة لبايثون

يمكن أن تكون Python أكثر سهولة في الاستخدام بسبب مزاياها. يرجى الاطلاع أدناه على استخدامات لغة البايثون لأسباب مختلفة:

تطوير مواقع الويب ولغات البرمجة واختبار البرامج وغيرها

1. التطبيقات

يمكن استخدام Python لتطوير تطبيقات مختلفة مثل تطبيقات الويب والتطبيقات القائمة على واجهة المستخدم الرسومية وتطبيقات تطوير البرامج والتطبيقات العلمية والرقمية وبرمجة الشبكات والألعاب والتطبيقات ثلاثية الأبعاد وتطبيقات الأعمال الأخرى. إنه يجعل واجهة تفاعلية وتطوير سهل للتطبيقات.

2. نماذج البرمجة المتعددة

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

3. مكتبة قياسية قوية

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

4. متوافق مع المنصات والأنظمة الرئيسية

إنه متوافق بشكل أساسي مع الأنظمة الأساسية والأنظمة الرئيسية حيث يتم استخدامه بشكل أساسي لتطوير التطبيقات. بمساعدة مترجمي لغة Python ، يمكن تشغيل كود Python على منصات وأدوات معينة لأنه يدعم العديد من أنظمة التشغيل. نظرًا لأن python هي لغة برمجة عالية المستوى مفسرة وتسمح لك بتشغيل الكود على أنظمة أساسية متعددة. يمكن تنفيذ الكود الجديد والمعدّل بدون إعادة تجميع ، ويمكن مراقبة تأثيره أو التحقق منه. هذا يعني أنه & # 8217s غير مطلوب لإعادة ترجمة الكود بعد كل تغيير. تساعد هذه الميزة في توفير وقت التطوير للمطورين.

5. الوصول إلى قاعدة البيانات

تساعد استخدامات Python أيضًا في الوصول إلى قاعدة البيانات بسهولة. تساعد Python في تخصيص واجهات قواعد البيانات المختلفة مثل MySQL و Oracle و Microsoft SQL Server و PostgreSQL وقواعد البيانات الأخرى. يحتوي على قاعدة بيانات كائن مثل Durus و ZODB. يتم استخدامه لقاعدة البيانات القياسية API ومتاح مجانًا للتنزيل.

6. قراءة التعليمات البرمجية

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

7. تبسيط تطوير البرامج المعقدة

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

8. العديد من الأطر والأدوات مفتوحة المصدر

Python مفتوح المصدر ومتاح بسهولة. يساعد هذا أيضًا في تقدير تكلفة تطوير البرامج بشكل كبير. هناك العديد من التطبيقات مفتوحة المصدر لأطر عمل Python والمكتبات وأدوات التطوير لتطوير التطبيق دون وضع تكلفة إضافية. تعمل أطر Python على تبسيط وتسريع العملية لتطوير تطبيقات الويب ، والأطر هي Django و Flask و Pyramid وما إلى ذلك. تتوفر أطر عمل Python GUI لتطوير التطبيق القائم على واجهة المستخدم الرسومية.

9. اعتماد التطوير المدفوع بالاختبار

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

10. التطبيقات الأخرى التي تستخدم بيثون

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

استنتاج

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

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

مقالات مقترحة

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


5. عمليات الاستبدال المتعددة: استبدل الأنماط المتعددة بنفس السلسلة

استبدل أي من foo أو bar أو baz بـ foobar

أداة Linux البديلة الجيدة هي rpl، التي تمت كتابتها في الأصل لمشروع دبيان ، لذا فهي متوفرة مع apt-get install rpl في أي توزيعة مشتقة من دبيان ، وقد تكون مخصصة للآخرين ، ولكن بخلاف ذلك يمكنك تنزيل ملف tar.gz من SourceForge.

لاحظ أنه إذا كانت السلسلة تحتوي على مسافات ، فيجب وضعها ضمن علامات اقتباس. افتراضيا rpl يعتني بأحرف كبيرة ولكن ليس من كلمات كاملة، ولكن يمكنك تغيير هذه الإعدادات الافتراضية باستخدام الخيارات -i (تجاهل الحالة) و -w (الكلمات بأكملها). يمكنك أيضا تحديد ملفات متعددة:

أو حتى تحديد ملف ملحقات (-x) للبحث أو حتى البحث بشكل متكرر (-R) في الدليل:

يمكنك أيضًا البحث / الاستبدال بتنسيق الوضع التفاعلي مع الخيار -p (موجه):

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

الخيارات الأخرى التي تستحق التذكر هي -e (شرف هscapes) التي تسمح بالتعبيرات العادية ، بحيث يمكنك البحث أيضًا في علامات التبويب ( t) ، والأسطر الجديدة ( n) ، وما إلى ذلك. يمكنك استخدام -f إلى أذونات الإجبار (بالطبع ، فقط عندما يكون لدى المستخدم أذونات الكتابة) و -d للحفاظ على أوقات التعديل`).

أخيرًا ، إذا لم تكن متأكدًا مما سيحدث بالضبط ، فاستخدم -s (وضع المحاكاة).


برنامج كامل: الطلبات غير المتزامنة

لقد نجحت في الوصول إلى هذا الحد ، والآن حان وقت المرح والجزء غير المؤلم. في هذا القسم ، تقوم أنت & rsquoll بإنشاء جامع عناوين URL خاص بكشط الويب ، areq.py ، باستخدام aiohttp ، وهو إطار عمل عميل / خادم HTTP سريع للغاية. (نحتاج فقط إلى جزء العميل.) يمكن استخدام هذه الأداة لتعيين الاتصالات بين مجموعة من المواقع ، مع الروابط التي تشكل رسمًا بيانيًا موجهًا.

ملحوظة: قد تتساءل لماذا لا تتوافق حزمة طلبات Python & rsquos مع rsquot مع IO غير المتزامن. الطلبات مبنية على الجزء العلوي من urllib3 ، والذي بدوره يستخدم Python & rsquos http ووحدات المقبس.

بشكل افتراضي ، يتم حظر عمليات مأخذ التوصيل. هذا يعني أن بايثون فازت بـ & rsquot مثل انتظار طلبات الحصول على (url) لأن .get () ليست منتظرة. في المقابل ، كل شيء تقريبًا في aiohttp عبارة عن coroutine منتظر ، مثل session.request () و response.text (). إنها & rsquos حزمة رائعة بخلاف ذلك ، ولكنك & rsquos تقوم بإيذاء نفسك باستخدام الطلبات في التعليمات البرمجية غير المتزامنة.

سيبدو هيكل البرنامج عالي المستوى كما يلي:

اقرأ تسلسل عناوين URL من ملف محلي ، urls.txt.

أرسل طلبات GET لعناوين URL وفك تشفير المحتوى الناتج. إذا فشل ذلك ، فتوقف عند هذا الحد للحصول على عنوان URL.

ابحث عن عناوين URL داخل علامات href في HTML للاستجابات.

اكتب النتائج على foundurls.txt.

افعل كل ما سبق بشكل غير متزامن ومتزامن قدر الإمكان. (استخدم aiohttp للطلبات ، وملفات aiofiles لملحقات الملفات. هذان مثالان أساسيان على الإدخال / الإخراج المناسبين تمامًا لنموذج الإدخال / الإخراج غير المتزامن.)

فيما يلي محتويات urls.txt. إنها & رسقوس ليست ضخمة ، وتحتوي في الغالب على مواقع يتاجر بها بشكل كبير:

يجب أن يعرض عنوان URL الثاني في القائمة استجابة 404 ، والتي تحتاج & rsquoll إلى التعامل معها بأمان. إذا كنت & rsquore تقوم بتشغيل إصدار موسع من هذا البرنامج ، فربما تحتاج & rsquoll إلى التعامل مع مشكلات أكثر صعوبة من ذلك ، مثل انقطاع الاتصال بالخادم وعمليات إعادة التوجيه التي لا نهاية لها.

يجب أن يتم تقديم الطلبات نفسها باستخدام جلسة واحدة ، للاستفادة من إعادة استخدام الجلسة وتجمع الاتصال الداخلي rsquos.

دع & rsquos نلقي نظرة على البرنامج الكامل. نحن & rsquoll نسير عبر الأشياء خطوة بخطوة بعد:

هذا البرنامج النصي أطول من برامج الألعاب الأولية ، لذا دعنا نكسرها.

HREF_RE الثابت هو تعبير عادي لاستخراج ما & rsquore الذي نبحث عنه في النهاية ، علامات href داخل HTML:

coroutine fetch_html () عبارة عن غلاف حول طلب GET لتقديم الطلب وفك شفرة HTML للصفحة الناتجة. يقدم الطلب وينتظر الرد ويثير على الفور في حالة عدم وجود 200 حالة:

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

نحن في انتظار session.request () و resp.text () لأنهم & rsquore coroutines المنتظرة. ستكون دورة الطلب / الاستجابة بخلاف ذلك الجزء طويل الذيل الذي يستغرق وقتًا طويلاً من التطبيق ، ولكن مع IO غير المتزامن ، يتيح fetch_html () حلقة الحدث للعمل على وظائف أخرى متاحة بسهولة مثل التحليل وكتابة عناوين URL التي تم جلبها بالفعل .

التالي في سلسلة coroutines يأتي parse () ، الذي ينتظر fetch_html () لعنوان URL معين ، ثم يستخرج جميع علامات href من تلك الصفحة & rsquos HTML ، مع التأكد من أن كل منها صالح وتنسيقه كمسار مطلق.

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

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

بعد ذلك ، يأخذ coroutine write () كائن ملف وعنوان URL واحد ، وينتظر التحليل () لإرجاع مجموعة من عناوين URL التي تم تحليلها ، وكتابة كل منها إلى الملف بشكل غير متزامن مع عنوان URL المصدر الخاص به من خلال استخدام ملفات aiofiles ، وهي حزمة لـ ملف غير متزامن IO.

أخيرًا ، يعمل Bul_crawl_and_write () كنقطة دخول رئيسية في سلسلة script & rsquos من coroutines. يستخدم جلسة واحدة ، ويتم إنشاء مهمة لكل عنوان URL تتم قراءته في النهاية من urls.txt.

فيما يلي بعض النقاط الإضافية التي تستحق الذكر:

يحتوي ClientSession الافتراضي على محول بحد أقصى 100 اتصال مفتوح. لتغيير ذلك ، قم بتمرير مثيل asyncio.connector.TCPConnector إلى ClientSession. يمكنك أيضًا تحديد حدود على أساس كل مضيف.

يمكنك تحديد الحد الأقصى من المهلات لكل من الجلسة ككل وللطلبات الفردية.

يستخدم هذا البرنامج النصي أيضًا غير متزامن مع ، والذي يعمل مع مدير سياق غير متزامن. لقد خصصت & rsquot قسمًا كاملاً لهذا المفهوم لأن الانتقال من مديري السياق المتزامن إلى غير المتزامن واضح إلى حد ما. يجب أن يحدد الأخير .__ aenter __ () و .__ aexit __ () بدلاً من .__ خروج __ () و .__ أدخل __ (). كما قد تتوقع ، لا يمكن استخدام غير المتزامن مع إلا داخل دالة coroutine معلنة مع تعريف غير متزامن.

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

هنا & rsquos التنفيذ بكل مجدها ، كما يحصل areq.py ويوزع ويحفظ النتائج لـ 9 عناوين URL في أقل من ثانية:

هذا & رسكووس ليس رث جدا! كتحقق من الصحة ، يمكنك التحقق من عدد الأسطر في الإخراج. في حالتي ، هو & rsquos 626 ، ولكن ضع في اعتبارك أن هذا قد يتقلب:

الخطوات التالية: إذا كنت & rsquod ترغب في زيادة ما قبل ، اجعل هذا webcrawler متكررًا. يمكنك استخدام aio-redis لتتبع عناوين URL التي تم الزحف إليها داخل الشجرة لتجنب طلبها مرتين ، وربط الروابط بمكتبة Python & rsquos networkx.

تذكر أن تكون لطيفًا. إرسال 1000 طلب متزامن إلى موقع ويب صغير غير مرغوب فيه أمر سيء وسيء وسيء. هناك طرق للحد من عدد الطلبات المتزامنة التي تقوم بها & rsquore في دفعة واحدة ، مثل استخدام كائنات sempahore لـ asyncio أو استخدام نمط مثل هذا. إذا لم & rsquot الانتباه إلى هذا التحذير ، فقد تحصل على مجموعة كبيرة من استثناءات TimeoutError وينتهي بك الأمر فقط إلى الإضرار ببرنامجك.


1 إجابة 1

شكرا لتقاسم الكود الخاص بك!

لن أغطي جميع أسئلتك ولكني سأبذل قصارى جهدي.

(تحذير ، بريد طويل وارد)

هل تطبيقي صحيح؟ (الاختبارات تقول ذلك)

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

هل يمكن تسريعها؟

أول شيء فعلته هو إجراء تغيير طفيف في ملف الاختبار الخاص بك (أسميته test_heap.py) لبذر إنشاء القائمة العشوائية. لقد غيرت أيضًا استدعاء random.sample ليكون أكثر مرونة مع معلمة sample_size.

لذا فإن عدد السكان من العشوائية دائمًا ما يكون أكبر من حجم العينة. ربما هناك طريقة أفضل؟

قمت أيضًا بتعيين حجم العينة ليكون 50000 للحصول على حجم مناسب للخطوة التالية.

كانت الخطوة التالية التنميط الكود باستخدام python -m cProfile -s cumtime test_heap.py. إذا لم تكن معتادًا على ملف التعريف ، فراجع المستند. أقوم بتشغيل الأمر عدة مرات لفهم الاختلافات في التوقيت ، مما يمنحني خطًا أساسيًا للتحسين. كانت القيمة الأصلية:

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

يتم إنفاق الكثير من الوقت في _siftdown ووقت أقل بكثير _Siftup ، ويتم استدعاء بعض الوظائف عدة مرات ، لذلك دعونا نرى ما إذا كان بإمكاننا إصلاح ذلك.

(كان يجب أن أبدأ بـ _siftdown التي كانت السمكة الكبيرة هنا ولكن لسبب ما ، بدأت بـ _Siftup ، سامحني)

تسريع _siftup

لقد غيرت طريقة حساب parent_index لأنني نظرت إلى مصدر الوحدة النمطية heapq وهم يستخدمونها. (انظر هنا) لكنني لم أستطع رؤية الاختلاف في التوقيت من هذا التغيير وحده.

ثم قمت بإزالة الاستدعاء إلى _get_parent وقمت بإجراء التغيير المناسب (نوع من تضمينه لأن استدعاء الوظيفة ليس رخيصًا في Python) والوقت الجديد هو

انخفضت مكالمات الوظائف بشكل واضح ولكن الوقت انخفض فقط حوالي 70-80 مللي ثانية. ليس انتصارًا كبيرًا (أقل قليلاً من 3٪ تسريع). ولم تتحسن قابلية القراءة لك إذا كان الأمر يستحق ذلك.

تسريع _siftdown

كان التغيير الأول لتحسين إمكانية القراءة.

لقد غيرت المهمة الثلاثية

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

(قمت بتشغيلها 10 مرات وكنت دائمًا قد اكتسبت حوالي 80-100 مللي ثانية). لا أفهم حقًا لماذا ، إذا كان بإمكان أي شخص أن يشرح لي؟

كما هو الحال في _siftup ، قمت بتضمين مكالمتين من الوظيفة المساعدة _get_left_child و _get_right_child والتي دفعت ثمنها!

هذا تسريع بنسبة 30٪ من خط الأساس.

(ما يلي هو تحسين إضافي أحاول شرحه ولكني فقدت الرمز الذي كتبته له ، وسأحاول إعادة المحاولة لاحقًا. قد يمنحك فكرة عن المكسب)

ثم باستخدام خدعة heapq للمقارنة المتخصصة لـ max و min (باستخدام إصدار _siftdown_max و _siftup_max استبدال المقارنة بـ & gt والقيام بالشيء نفسه لمدة دقيقة) يعطينا:

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

بمقارنة التعليمات البرمجية الخاصة بي بالرمز الموجود في الوحدة النمطية heapq ، يبدو أنها لا توفر فئة heapq ، ولكنها توفر فقط مجموعة من العمليات التي تعمل على القوائم؟ هل هذا أفضل؟

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

إن النظر إلى استدعاء الوظيفة أمر مكلف ، وقد يكون التكرار الحلقي بدلاً من التكرار أسرع. لكني أجد أنه من الأفضل التعبير عنه كعودة.

هل الكود الخاص بي نظيف وقابل للقراءة؟

بالنسبة للجزء الأكبر نعم! كود رائع ، لقد حصلت على مستندات لطرقك العامة ، فأنت تحترم PEP8 كل شيء جيد. ربما يمكنك إضافة وثائق للطريقة الخاصة أيضًا؟ خاصة بالنسبة للأشياء الصعبة مثل _siftdown و _siftup.

الثلاثية التي غيرتها في _siftdown أعتبرها شخصياً صعبة القراءة.

المقارن يبدو وكأنه اسم فرنسي ، لماذا لا تقارن؟ إما فاتني شيء أو اختلطت اللغة ولا يجب عليك ذلك.

هل يكفي اختباري (على سبيل المثال مقابلة)؟

سأقول لا. استخدم وحدة لإجراء اختبار الوحدة. أنا شخصيا أحب بيتيست.

أنت تسبق اسم ملف الاختبار الخاص بك عن طريق test_ ثم تسبق طرق الاختبار الخاصة بك / تلحق بواسطة test_ / _test. ثم تقوم فقط بتشغيل pytest في سطر الأوامر ويكتشف الاختبارات تلقائيًا وتشغيلها ويعطيك تقريرًا. أوصي بشدة بتجربته.

من الأدوات الرائعة الأخرى التي كان من الممكن أن تستخدمها هي الفرضية التي تقوم باختبار قائم على الخصائص. يعمل بشكل جيد مع بيتيست.

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

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

هل استخدام الفئات الفرعية MinHeap و MaxHeap & amp ؛ طريقة المقارنة التي تميزهما ، طريقة جيدة لتوفير كلا النوعين من الأكوام؟

أعتقد أنه هو! ولكن فيما يتعلق بالسرعة ، يجب عليك بدلاً من ذلك إعادة تفكيك الفرز والنخل في الفئات الفرعية واستبدال مثيل المقارنة (أ ، ب) بواسطة a & lt b أو a & gt b في الكود.

آخر شيء ملاحظة ، على ويكيبيديا ، المقالة تقول:

غربلة: انقل عقدة لأعلى في الشجرة ، طالما كانت هناك حاجة لاستخدامها لاستعادة حالة الكومة بعد الإدراج. تم استدعاء & quotsift & quot لأن العقدة تتحرك لأعلى الشجرة حتى تصل إلى المستوى الصحيح ، كما هو الحال في الغربال.

sift-down: انقل عقدة لأسفل في الشجرة ، على غرار الغربلة المستخدمة لاستعادة حالة الكومة بعد الحذف أو الاستبدال.

وأعتقد أنك استخدمته في هذا السياق ولكن في تطبيق وحدة heapq ، يبدو أن الاسم عكسيًا؟

يستخدمون siftup in pop و siftdown في الدفع بينما تخبرنا ويكيبيديا أن نقوم بالعكس. يمكن لأي شخص أن يشرح من فضلك؟


خوارزمية Metaphone مزدوجة

يعود مبدأ الخوارزمية إلى القرن الماضي ، في الواقع إلى عام 1918 (عندما كان الكمبيوتر الأول على بعد سنوات).

تمامًا مثل المعلومات الجانبية (في حالة مشاركتك في برنامج مسابقة المليونير) ، كان الكمبيوتر الأول على بعد 23 عامًا

كان Z3 عبارة عن كمبيوتر كهروميكانيكي ألماني صممه Konrad Zuse. كان أول كمبيوتر رقمي يعمل تلقائيًا بالكامل وقابل للبرمجة في العالم. تم بناء Z3 مع 2600 مرحل ، مطبقًا طول كلمة 22 بت يعمل بتردد ساعة يبلغ حوالي 4-5 هرتز. تم تخزين كود البرنامج على فيلم مثقوب. تم إدخال القيم الأولية يدويًا (ويكيبيديا)

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

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

تعتمد خوارزمية Soundex على تصنيف صوتي لأحرف الأبجدية. يصف راسل في براءة الاختراع الخاصة به الاستراتيجية التي تحدد قيمة رقمية لكل فئة. على سبيل المثال ، تم تعيين جونسون على J525 ، ميلر إلى M460 إلخ.

تطورت خوارزمية Soundex بمرور الوقت في سياق الكفاءة والدقة وتم استبدالها بخوارزميات أخرى.

بالنسبة للجزء الأكبر ، تم استبدالهم جميعًا بنظام فهرسة قوي يسمى Double Metaphone. الخوارزمية متاحة كمصدر مفتوح وتم إصدار نسختها الأخيرة في حوالي عام 2009.

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

ال هاتف مزدوج تقوم الطريقة بإرجاع مجموعة مكونة من حرفين ، وهي ترجمة صوتية للكلمة التي تم تمريرها. لنا قارن تُظهر الطريقة قدرة الخوارزمية على الترتيب وهي محدودة للغاية.

دعونا نجري بعض فحوصات التحقق لتقييم كفاءة الخوارزمية من خلال تقديم test_class.py الذي يعتمد على بايثون بيتيست نطاق.

يسهّل إطار عمل pytest كتابة اختبارات صغيرة ، ومع ذلك فإن المقاييس تدعم الاختبارات الوظيفية المعقدة للتطبيقات والمكتبات. (نهاية لهذه الغاية)

استخدامه واضح ومباشر ، ويمكنك مشاهدة تنفيذ فئة الاختبار أدناه

تظهر نتيجة الاختبارات أدناه. استخدمنا اسمين (A + B) وكنا نتحقق مع بعض الأسماء المتغيرة (A1 / A2 + B1 / B2 / B3) من كفاءة الخوارزمية.

  • اجتاز A1 + B1 اختبار المطابقة القوية. لذا يبدو أن المسافات المفقودة واستبدالات ü / ä بحرف u / a لا تؤثر على إنشاء مفتاح metaphone المزدوج
  • B2 يمرر المباراة العادية. يتم تغطية الأخطاء الإملائية بواسطة الخوارزمية أيضًا
  • فشل A2 + B3. يستخدم A2 اختصارًا لجزء الاسم ، والذي لا يمكن التعامل معه. هذا السلوك كان علينا توقعه وقررنا تقديم خوارزمية موسع الاسم (انظر أعلاه). فشل B3 بسبب فقدان "-". كان هذا غير متوقع ، لكننا نغطي هذا السلوك بخطوة منظف الاسم الثاني.

قائمة الفهم (اختياري)

تعد عمليات استيعاب القوائم ميزة أكثر تقدمًا وهي لطيفة في بعض الحالات ولكنها ليست ضرورية للتمارين وليست شيئًا تحتاج إلى تعلمه في البداية (أي يمكنك تخطي هذا القسم). قائمة الفهم هي طريقة مضغوطة لكتابة تعبير يتم توسيعه إلى قائمة كاملة. لنفترض أن لدينا قائمة بأرقام [1 ، 2 ، 3 ، 4] ، فإليك قائمة الفهم لحساب قائمة بمربعاتها [1 ، 4 ، 9 ، 16]:

الصيغة هي [ إكسبر for var in list ] -- the for var in list looks like a regular for-loop, but without the colon (:). ال expr to its left is evaluated once for each element to give the values for the new list. Here is an example with strings, where each string is changed to upper case with '. ' appended:

You can add an if test to the right of the for-loop to narrow the result. The if test is evaluated for each element, including only the elements where the test is true.