Как создать новый столбец и написать акронимы для каждой соответствующей записи аэропорта, используя Python в файле csv?
У меня есть CSV-файл аэропортов, и я хочу, чтобы названия аэропортов были в форме аббревиатуры, чтобы я мог более компактно отображать их на карте с символом аэропорта, показывающим, что это такое.
Примером может служить этот образец списка:
['Ранчо Брэдли Скай', 'Аэропорт Файер-Айленда', 'Муниципальный аэропорт Палмера']
в это: ['B.S.R', 'FIA', 'P.M.A.']
Далее, как бы вы поставили '.' точка пунктуация между каждой буквой аббревиатуры?
Я думаю, это будет + "." +
или что-то с ".".join
?
Наконец, было бы полезно, если бы был способ избавиться от слова «аэропорт», чтобы каждая аббревиатура не заканчивалась на «А»?
Например, что-то вроде .strip
"Аэропорт"... но это не основная цель.
В пронумерованном списке ниже показаны примеры кода, который у меня есть, но у меня нет последовательного решения. Поэтому, пожалуйста, берите только то, что имеет смысл, а если нет, то я хотел бы изучить более эффективный синтаксис!
[Исходные данные об аэропорте взяты из ESRI Living Atlas.] У меня есть новое поле/столбец под названием «NameAbbrev», в которое я хочу записать аббревиатуры, но я сделал это в ArcPro, который по сути содержит интерфейс «черный ящик» для расчета новых поля.
Примечание: почему я размещаю сообщения в SO, а не в GeoNet, если это связано с картой? Обратите внимание, что моя цель — использовать python, и я не спрашиваю об ArcPy. Я думаю, что базовый принцип основан на Python для работы с файлом csv (тогда как ArcPy будет работать с классом объектов, и вам придется использовать функции, назначенные ESRI). И SO достигает более широкой аудитории экспертов по Python.
1) До сих пор я сталкивался с тем, как превратить строку в аббревиатуру, которая отлично работает с одной строкой, а не со списком: Создание акронимов в Python
acronym = "".join(word[0] for word in test.upper().split())
2) и попытался разделить элементы в списке или как сделать строки чтения в файле csv на основе примера (не моего): Ошибка атрибута: объект 'list' не имеет атрибута 'split'
def getQuakeData():
filename = input("Please enter the quake file: ")
# Use with to make sure the file gets closed
with open(filename, "r") as readfile:
# no need for readlines; the file is already an iterable of lines
# also, using generator expressions means no extra copies
types = (line.split(",") for line in readfile)
# iterate tuples, instead of two separate iterables, so no need for zip
xys = ((type[1], type[2]) for type in types)
for x, y in xys:
print(x,y)
getQuakeData()
3) Кроме того, я смог использовать pandas, чтобы распечатать только столбец имен аэропортов в списке:
import pandas
colnames = ['OBJECTID', 'POLYGON_ID', 'POLYGON_NM', 'NM_LANGCD', 'FEAT_TYPE', 'DETAIL_CTY', 'FEAT_COD', 'NAME_FIX', 'ORIG_FID', 'NameAbbrev']
data = pandas.read_csv(r'C:\Users\...\AZ_Airports_table.csv', names=colnames)
names = data.NAME_FIX.tolist()
print(names)
#Here is a sample of the list of airport names/print result.
#If you want a sample to demo guidance you could use these names:
#['NAME_FIX', 'Bradley Sky Ranch', 'Fire Island Airport', 'Palmer Municipal Airport', 'Kodiak Airport', 'Nome Airport', 'Kenai Municipal Airport', 'Iliamna Airport', 'Sitka Airport', 'Wrangell Airport', 'Sand Point Airport', 'Unalaska Airport', 'Adak Airport', 'Homer Airport', 'Cold Bay Airport']
4) Я также мог использовать курсор поиска и строку записи в прошлом, но я не знаю, как именно применять эти методы. (несвязанный пример):
with open(outCsv, 'wb') as ouputCsv:
writer = csv.writer(outputCsv)
writer.writerow(fields) # writes header containing list of fields
rows = arcpy.da.SearchCursor(fc, field_names=fields)
for row in rows:
writer.writerow(row) # writes fc contents to output csv
del rows
5) Итак, у меня есть кусочки, но я не знаю, как их собрать и подходят ли они друг к другу. Это мой монстр Франкенштейна решения, но он неправильный, потому что пытается посмотреть на каждый столбец!
def getAcronym():
filename = r'C:\Users\...\AZ_Airports_table.csv'
# Use with to make sure the file gets closed
with open(filename, "r") as readfile:
# no need for readlines; the file is already an iterable of lines
# also, using generator expressions means no extra copies
airport = (line.split(",") for line in readfile)
# iterate tuples, instead of two separate iterables, so no need for zip
abbreviation = "".join(word[0] for word in airport.upper().split())
# could also try filter(str.isupper, line)
print(abbreviation)
getAcronym()