أكثر

خطأ في إضافة الصف - يجب أن يتطابق حجم التسلسل مع حجم الصف


لدي هذا الجدول مع صف واحد

timestamp_pretty 3.1.2014 9:13 الطابع الزمني 1،38874E + 12 msgid 3 targetType A mmsi 205533000 lat 53.4346 long 14.580546 posacc 0 sog 0 cog 319.5 shipType CARGO dimBow 68 Draft 4 dimPort 6 dimStarboard 5 dimStern 12 شهر 1 أسبوع 1 imo 8404446 البلد سريع جوليا

أرغب في إنشاء فئة ميزة نقطة من Arcpy باستخدام مؤشر الإدخال:

# اقرأ csv csv.register_dialect ("xls"، lineterminator = " n") f = open (incsv، "r") القارئ = csv.reader (f ، اللهجة = "xls") # أضف الحقول إلى fc desc = arcpy.Describe (incsv) للحقل في desc.fields: arcpy.AddField_management (outfc ، field.name ، field.type) # حقول أسماء الحقول = desc.fields fieldnames = [field.name for field in field] # Create InsertCursor. cursor = arcpy.da.InsertCursor (outfc، ['SHAPE @ XY'] + fieldnames) count = 0 next (reader، None) # تخطي رأس الصف في القارئ: إذا كان العدد٪ 10000 == 0: طباعة صف المعالجة {0} ". format (count) +" of "+ table Ycoord = row [5] Xcoord = row [6] newrow = [(float (Xcoord)، float (Ycoord))] + row [0:] cursor. insertRow ([newrow]) count + = 1 del cursor f.close ()

لكنني أتلقى هذا الخطأ:

السطر 130 ، في  cursor.insertRow ([newrow]) TypeError: يجب أن يتطابق حجم التسلسل مع حجم الصف

لقد مررت بإجابات مماثلة لـ SE وأجريت العديد من الاختبارات (أيام) ولكن دون جدوى.

****تعديل****

إذا قمت بطباعة نتيجة newrow والصف [0:] هكذا:

newrow = [(float (Xcoord)، float (Ycoord))] + row [0:] طباعة "new row:" + str (newrow) print "row [0:]:" + str (row [0:])

* تحرير 2 * الاسم والنوع الاستخدام لإنشاء فئة المعالم

[u'timestamp_pretty '، u'timestamp'، u'msgid '، u'targetType'، u'mmsi '، u'lat'، u'long '، u'lat_D'، u'long_D '، u'posacc' ، u'sog '، u'cog'، u'shipType '، u'dimBow'، u'draught '، u'dimPort'، u'dimStarboard '، u'dimStern'، u'month '، u'week' ، u'imo '، u'country'، u'name '] [u'Date'، u'Double '، u'Integer'، u'String '، u'Integer'، u'String '، u'String '، u'Double'، u'Double '، u'Integer'، u'String '، u'String'، u'String '، u'Integer'، u'String '، u'Integer'، u'Integer '، u'Integer'، u'Integer '، u'Integer'، u'Integer '، u'String'، u'String ']

أحصل على هذه النتيجة:

صف جديد: [(14.580546، 53.4346)، '03 / 01/2014 09:13:26 '،' 1388740406000 '،' 3 '،' A '،' 205533000 '، '53 .4346'، '14 .580546 '،' 0 ' ، '0'، '319.5'، 'CARGO'، '68'، '4'، '6'، '5'، '12'، '01'، '01'، '8404446'، 'بلجيكا'، ' FAST JULIA '] صف [0:]: ['03 / 01/2014 09:13:26'، '1388740406000'، '3'، 'A'، '205533000'، '53 .4346 '، '14 .580546'، '0 '،' 0 '،' 319.5 '،' CARGO '،' 68 '،' 4 '،' 6 '،' 5 '،' 12 '،' 01 '،' 01 '،' 8404446 '،' بلجيكا '، "سريع جوليا"]

أنا الآن ، newrow لديه 22 حقلاً (حساب الإحداثيات في البداية) والصف [0:] به 21. هل هذا هو الخطأ؟ إذا كان الأمر كذلك ، فلماذا نجح في النص الأصلي الذي حصلت عليه منJohn؟


كل هذه التعليمات البرمجية مبالغ فيها ، يمكنك تحويل الجدول بأكمله إلى طبقة باستخدام أداة Make XY Event Layer ، في سطر واحد من التعليمات البرمجية! انظر نموذج التعليمات البرمجية في صفحة التعليمات الخاصة بالأداة.

إذا كنت تريد أن تكون مجموعة البيانات دائمة ، فيمكنك استخدام أداة نسخ الميزات ، وهي سطر آخر من التعليمات البرمجية!

يمكن دمجها معًا داخل نموذج بناء أو استدعاؤها من داخل نص بيثون.


  1. الحل الأول البسيط: فرض نوع النص

    # اقرأ csv csv.register_dialect ("xls"، lineterminator = " n") f = open (incsv، "r") القارئ = csv.reader (f ، اللهجة = "xls") # أضف الحقول إلى fc desc = arcpy.Describe (incsv) للحقل في desc.fields: arcpy.AddField_management (outfc، field.name، "TEXT") # force text format # fieldnames fields = desc.fields fieldnames = [field.name for field in field] # إنشاء InsertCursor. cursor = arcpy.da.InsertCursor (outfc، ['SHAPE @ XY'] + fieldnames) count = 0 # TODO: قم بإنشاء وظيفة كشف المواقع الميدانية مع حالة التجاهل # check_x = ['x'، 'lng'، 'long'، 'longitude'] واستخدامات أخرى # check_y = ['y'، 'lat'، 'latitude'] واستخدام آخر بعد ذلك (قارئ ، بلا) # تخطي رأس الصف في القارئ: إذا كان العدد٪ 10000 == 0: طباعة "صف المعالجة {0}". تنسيق (عدد) + "من" + جدول Ycoord = صف [5] # مجموعة صف مع كاشف الموضع Xcoord = صف [6] # مجموعة صف مع كاشف الموضع newrow = [(تعويم (Xcoord) ، float (Ycoord))] + row [0:] cursor.insertRow (newrow) # تغيير هنا لا تقم بإضافة قائمة مزدوجة ويفضل pass tuple: tuple (newrow) إذا كان الصف  العد + = 1 del cursor f.close ()