如何本地处理Geonames大文件,提取英国主要城镇数据并操作?
处理Geonames大文件并提取英国城市数据的方案
我之前折腾过Geonames的超大文本文件,完全懂你打不开的痛苦!下面几个方法能帮你快速提取英国的目标数据,不用硬怼整个大文件:
方法一:用命令行快速筛选(零编程基础也能搞定)
命令行工具处理大文件效率超高,几秒就能完成筛选:
- Windows系统:打开命令提示符(CMD),切换到
allcountries.txt所在的文件夹,运行这条命令:
这条命令会把所有包含英国国家代码findstr /C:"GB" allcountries.txt > uk_cities.txtGB的行提取出来,保存成uk_cities.txt——这个小文件就能用Notepad++、Sublime随便打开了。 - Linux/macOS系统:打开终端,进入文件目录,运行:
grep "GB" allcountries.txt > uk_cities.txt
小提示:Geonames的
allcountries.txt是制表符分隔的,第8列是国家代码,所以这个筛选是精准的。如果只想保留城市(排除村庄、景点等),可以查一下Geonames的feature code(第7列),比如只保留PPL(城镇)、PPLA(首府)这类代码,命令可以改成更精准的筛选(比如Windows用findstr /R "\tPPL\t.*GB",不过稍微复杂点,先提取所有GB数据再筛选也很方便)。
方法二:用Python脚本精准提取所需字段(推荐,一步到位)
如果想直接提取你需要的地名、纬度、经度、国名、大洲这几个字段,写个简单的Python脚本最省心,输出的CSV文件Excel直接就能打开:
import csv # 先定义Geonames的列索引(从0开始数),以及大洲代码映射 COLUMN_MAP = { "place_name": 1, "latitude": 4, "longitude": 5, "country_name": 10, "continent_code": 17 } CONTINENT_NAME = { "EU": "Europe", "AS": "Asia", "AF": "Africa", "NA": "North America", "SA": "South America", "OC": "Oceania", "AN": "Antarctica" } # 处理文件 with open('allcountries.txt', 'r', encoding='utf-8') as infile, \ open('uk_target_data.csv', 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) # 先写表头 writer.writerow(["地名", "纬度", "经度", "国名", "大洲"]) for line in infile: # 按制表符拆分每行数据 fields = line.strip().split('\t') # 筛选英国数据(国家代码是GB) if len(fields) >= 18 and fields[8] == "GB": # 提取所需字段 place = fields[COLUMN_MAP["place_name"]] lat = fields[COLUMN_MAP["latitude"]] lon = fields[COLUMN_MAP["longitude"]] country = fields[COLUMN_MAP["country_name"]] continent = CONTINENT_NAME.get(fields[COLUMN_MAP["continent_code"]], "未知") # 写入CSV writer.writerow([place, lat, lon, country, continent])
运行这个脚本后,你会得到一个uk_target_data.csv文件,直接双击就能用Excel打开,所有需要的字段都整整齐齐的。如果只想保留城市,还可以在筛选条件里加个判断:fields[7] in ["PPL", "PPLA", "PPLA2", "PPLC"](这些是Geonames定义的城市类代码)。
后续操作:用Excel或其他工具处理
- Excel:直接打开生成的CSV文件就行,如果数据量还是有点大(比如几万行),可以用Excel的“数据”选项卡下的“筛选”功能快速整理。
- LibreOffice Calc:如果Excel还是卡,试试LibreOffice的表格工具,它处理大文件的能力比Excel强不少,完全免费。
内容的提问来源于stack exchange,提问作者FJ1993




