أكثر

تسريع كود Python لتحويل ملفات CSV متعددة إلى ملف أشكال؟

تسريع كود Python لتحويل ملفات CSV متعددة إلى ملف أشكال؟


أحاول العمل مع بعض بيانات الجريمة من https://data.police.uk/data/ البيانات منظمة في عدة ملفات .csv ، واحدة لكل شهر وكل جريمة مشفرة جغرافيًا باستخدام Lat و Long.

نظرًا لأن بنية الملف قد تختلف من شهر لآخر ، لا يمكنني دمج ملف csv معًا باستخدام نسخة * .csv Combined.csv في موجه الأوامر كما هو موضح هنا: https://www.itsupportguides.com/office-2010/how-to- دمج عدة ملفات csv في ملف csv واحد باستخدام cmd /

لذلك قررت استخدام python للتكرار خلال جميع ملفات csv في المجلد وإنشاء ملف شكل لكل ملف سأقوم بدمجه معًا في مرحلة لاحقة.

هذا هو الكود الذي توصلت إليه بعد النظر في هذا المنشور. هل لديك أي اقتراح لتحسين الكود الخاص بي؟

اضطررت إلى استخدام csvfile.replace ('-'، '_') لأن أسماء الملفات تبدو مثل 2012-05-metropolitan-street.csv ولا يمكنني استخدام "-" في اسم ملف الشكل الناتج.

import arcpy، os shpworkspace = r "G:  GIS DATA  Crime Data  CSV" arcpy.env.workspace = shpworkspace arcpy.env.overwriteOutput = True csvlist = arcpy.ListFiles ("*. csv") جرب: لملف csvfile في csvlist: outlayer = "CSVEventLayer" spatialreference = "GEOGCS ['GCS_WGS_1984'، DATUM ['D_WGS_1984'، SPHEROID ['WGS_1984'، 6378137.0،298.257223563]]، PRIMEM ['0.041733223563]]، PRIMEM [' 0.041733223563]] ]] ؛ - 400-400 1000000000؛ -100000 10000؛ -100000 10000؛ 8.98315284119522E-09؛ 0.001؛ 0.001؛ IsHighPrecision "arcpy.MakeXYEventLayer_management (csvfile،" Longitude "،" Latitude "، outlayer، spatialreference،" # ") shpfile = os.path.splitext (csvfile.replace ('-'، '_')) [0] arcpy.CopyFeatures_management (outlayer، shpfile) del outlayer باستثناء: # إذا حدث خطأ اطبع الرسالة إلى شاشة طباعة الشاشة. GetMessages ()

كما هو مبين في التعليقات ، واقترحه معظم المعلقين ، يبدو أن نقل البيانات من محرك أقراص مشترك إلى قرص محلي قد أزال الأداء محل القلق:

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


فيما يلي نص برمجي متعدد المعالجات يعمل على تسريع العملية برمتها. آمل أن يكون هذا سيساعدك.

استيراد arcpy استيراد نظام التشغيل استيراد العمليات المتعددة def process_csv_file (param): "" "وظيفة المعالجة المتعددة لمعالجة ملفات csv: param param: workspace and csv file information: return: shp file path" "try: arcpy.env.workspace = param.get ('workspace') csv_file = param.get ('file') print 'Processing: {}'. format (csv_file) arcpy.env.overwriteOutput = True shpfile = os.path.splitext (csv_file.replace ('-'، '_')) [0] temp_path = os.path.join ('in_memory'، ". انضم ([shpfile، '_EventLayer'])) spatialreference =" GEOGCS ['GCS_WGS_1984'، DATUM ['D_WGS_1984'، SPHEROID [ 'WGS_1984'، 6378137.0،298.257223563]]، PRIMEM ['Greenwich'، 0.0]، UNIT ['Degree'، 0.0174532925199433]]؛ - 400 -400 1000000000؛ -100000 10000؛ -100000 10000؛ 8.98315284119522E-09؛ 0.001؛ 0.001؛ IsHighPrecision "evt_lyr = arcpy.MakeXYEventLayer_management (csv_file،" Longitude "،" Latitude "، temp_path، spatialreference) arcpy.CopyFeatures_management (evt_lyr، shpfile) del evt_lyjoer return.path. shpfile) باستثناء استثناء كخطأ: retur n خطأ def main (): "" "الوظيفة الرئيسية" "" جرب: # مسار ملفات csv وملفات الشكل للاحتفاظ بمساحة العمل = r "C:  Users  surya  Downloads  CrimeData_Aug_Sep15  2015-08" # عدد الملفات للمعالجة في وقت معين = 4 بارامز = [{'مساحة العمل': مساحة العمل ، 'ملف': اسم_الملف} لـ file_name في os.listdir (مساحة العمل) إذا كان file_name.endswith ('. csv')] pool = multiprocessing.Pool ( العمليات = العملية) النتيجة = pool.map_async (process_csv_file، params) pool.close () pool.join () نتيجة طباعة باستثناء الاستثناء كخطأ: # إذا حدث خطأ اطبع الرسالة على خطأ طباعة الشاشة إذا __name__ == '__main__ ': الأساسية()

سررت بالمساعدة :)