Napisałem skrypt Pythona za pomocą arcpy, który wyświetla klasę wielokątów w Geobazie Pliku. Dodałem funkcję eksportowania atrybutów do osobnego pliku CSV. Używam kodu, który znalazłem w tym poście, który działa idealnie. Jednak ten kod eksportuje każdą kolumnę w klasie elementów. Chcę tylko, aby wyeksportować pól, które nie mają następujące nazwy: OBJECTID
, Shape
, lub Shape_Length
.
Mój plik CSV generuje się pomyślnie i poprawnie nie zawiera pól OBJECTID
lub Shape_Length
. Jednak Shape
pole jest zapisywane w pliku. Przykładowa wartość zapisana w tym polu to:
<geoprocessing describe geometry object object at 0x28CB90A0>
Dodałem wiersz, aby wydrukować nazwy pól podczas ich iteracji i, co zaskakujące, Shape
nie jest drukowany. To tak, jakby ArcGIS ukrywa go lub nadaje mu inną nazwę.
Kod mojej funkcji znajduje się poniżej:
def exportToTable():
"""
Exports the final outputs to a CSV File.
"""
# Create path to CSV File (note the varialbe outputPath is declared elsewhere).
CSVFile = outputPath+'\\FinalOutput.csv'
arcpy.AddMessage("Created CSV File: %s" %CSVFile)
# Get all fields in FinalOutput feature class and remove unwanted fields.
fields = arcpy.ListFields('FinalOutput')
for field in fields:
arcpy.AddMessage("Field.name is:"+field.name) #not printing 'Shape' field name
if field.name in (['OBJECTID', 'Shape', 'Shape_Length']):
fields.remove(field)
i = 1
f=open(CSVFile, 'w')
for field in fields:
#--write the wanted field names to the output file
if i < len(fields):
f.write('%s,' % field.name)
i += 1
else:
f.write('%s\n' % field.name)
# Use a search cursor to iterate through the rows of the table and write them to the CSV file.
rows = arcpy.SearchCursor('FinalOutput')
for row in rows:
i = 1
for field in fields:
if i < len(fields):
f.write('%s,' % row.getValue(field.name))
i += 1
else:
f.write('%s\n' % row.getValue(field.name))
del rows
f.close()
Czy ktoś wie, co się tutaj dzieje?
Zmodyfikowałem swój kod, aby postępować zgodnie z radą @sgrieve i nadal pisałem to Shape
pole. Jeśli dodać linię do wydrukowania nazwy pól jak to iteracje przez nich, to wymienia wszystkie pola z wyjątkiem tej Shape
dziedzinie, a mimo to nadal zapisuje do pliku CSV. Dodano także współrzędne X i Y wielokąta jako dwie nowe kolumny, a kolumny nie są już wyrównane z nazwami kolumn.
Zmodyfikowałem wiersz, w którym @sgrieve deklaruje następujące pola:
fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry']
Nowy kod działa dobrze, ale nadal nie jestem pewien, na czym polegał problem. Czy ktoś wie, co się działo? O co chodzi z Shape
polem?
Shape
pole zostało zapisane do pliku? Chociaż kod @ sgrieve prawdopodobnie poprawił mój kod, nie rozwiązał problemu.Odpowiedzi:
Uprościłem twój kod i poprawiłem błąd, używając modułu da wprowadzonego w 10.1. Znacznie usprawnia odczytywanie danych za pomocą kursorów i używany w połączeniu z
with
poleceniem ten kod powinien być bardziej stabilny, niż gdyby używał starszej metody dostępu do plików.Działa, tworząc listę wszystkich pól, a następnie usuwając pola, których nie chcesz z listy. Można to zrobić w ramach listy, ale byłoby to dość niechlujne i pozbawione pythonów. Po utworzeniu listy żądanych pól jest ona używana z modułem da do odczytu wszystkich danych z tych pól do kursora. Następnie można go zapętlić i zapisać w pliku, używając innego zrozumienia listy, aby połączyć wszystkie pola. Ma to tę zaletę, że działa dla dowolnej liczby pól większych niż 0.
źródło
Shape
pola wciąż jest zapisywana, ale wartości Kształt nie. 2. Istnieją teraz dwie nowe kolumny, które zostały dodane na początku tabeli, skutecznie przesuwając kolumny w prawo. Kolumny wydają się być współrzędnymi X i Y wielokąta.Shape
polem - może dlatego, że jest to typ geometrii. Zmodyfikowałem więc linię, w której deklarujesz,fields
że jest następująca:fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry']
to załatwiło sprawę. Nie jestem jednak pewien, dlaczego to nie działałoby.Myślę, że napotkałem ten sam problem i odkryłem powód, dla którego twoje pole „Kształt” nie zostało usunięte. Podczas korzystania z tej pętli:
Odkryłem, że w rzeczywistości usuwa tylko każde inne pole. Więc najpierw przejdzie przez pętlę, usunie „OBJECTID”, a następnie pole „Shape” przejdzie do miejsca zajmowanego poprzednio przez „OBJECTID” na liście, więc przejdzie do następnego, którym będzie wówczas „Shape_Length”.
Tak więc to nie geometria kształtu uniemożliwiała jego usunięcie, tylko fakt, że usuwa on każde inne pole podczas używania tego skryptu.
źródło
Kluczem do jednego aspektu tego jest określenie właściwej nazwy dla nieokreślonych przez użytkownika pól identyfikatora i geometrii obiektu. Typ pola geometrii to Double, co w tym przypadku jest nieprzydatne. Za pomocą funkcji opisu można określić poprawną nazwę dla tych pól dla różnych typów plików (np. Shapefile v plik gdb itp.; Złagodzenie wielu smutków, ponieważ oid zmieni się nawet w obrębie tego samego typu pliku czasami ...).
źródło