在Django/Python中规范化街道地址
我有一个Django表单,其中有一个字段是用来输入街道地址的TextInput
。
我想把输入的数据标准化。比如说:
>> normalize('420 East 24th St.')
'420 E. 24th Street'
>> normalize('221 Amsterdam Av')
'221 Amsterdam Ave.'
>> normalize('221 Amsterdam Avenue')
'221 Amsterdam Ave.'
或者类似这样的格式。我已经在使用geopy来进行地理编码。也许这能帮上忙?
另外:我应该在哪里进行标准化?是在数据库模型里,还是在表单字段的清理函数里?
4 个回答
4
我最近创建了一个叫做 street-address 的Python模块,它里面有一个叫做StreetAddressFormatter的工具,可以用来规范化你的地址。
4
这是我解决这个问题的方法(没有双关的意思):
### models.py ###
def normalize_address_for_display(address):
display_address = string.capwords(address)
# Normalize Avenue
display_address = re.sub(r'\b(Avenue|Ave.)\b', 'Ave', display_address)
# Normalize Street
display_address = re.sub(r'\b(Street|St.)\b', 'St', display_address)
# ...and other rules...
return display_address
class Store(models.Model):
name = models.CharField(max_length=32)
address = models.CharField(max_length=64)
city = models.CharField(max_length=32)
state = models.CharField(max_length=2)
zipcode = models.CharField(max_length=5)
@property
def display_address(self):
return normalize_address_for_display(self.address)
然后我在模板中使用了 Place.display_address
。这样我就可以在数据库中保留用户原始提交的数据,而不做任何修改,当我想要一个标准化的显示版本时,只需使用 display_address
。
欢迎大家评论或提出建议。
5
最可靠的方法是使用一个真正的地址验证服务。这样不仅可以根据美国邮政局的标准来规范(标准化)地址的各个部分(详细信息可以查看出版物28),而且你还可以确保这个地址是真的。
坦白说,我在SmartyStreets工作,我们提供这样的服务。这里有一段非常简单的Python示例代码,展示了如何通过HTTP GET请求使用我们的服务:
https://github.com/smartystreets/LiveAddressSamples/blob/master/python/street-address.py