我离Python的新蜜蜂不远,我想解析一个文件 原样:
Paris, 458 boulevard Saint-Germain
Paris, 343 boulevard Saint-Germain
Marseille, 343 boulevard Camille Flammarion
Marseille, 29 rue Camille Desmoulins
Marseille, 1 chemin des Aubagnens
该文件包含:城市,街道号码,街道类型和街道名称
此顺序始终相同,City后面跟一个逗号。
我现在已经这样做了:
#!/usr/bin/python3.4
import readline
import sys
try:
f = open(sys.argv[1])
except:
sys.exit()
lines = f.readlines()
print(lines)
我得到了这个输出:
['Paris, 458 boulevard Saint-Germain\n', 'Paris, 343 boulevard Saint-Germain\n', 'Marseille, 343 boulevard Camille Flammarion\n', 'Marseille, 29 rue Camille Desmoulins\n', 'Marseille, 1 chemin des Aubagnens\n']
似乎要做的事情,但现在我有2个问题:
如何为每种类型(City,number,streetType,streetName)制作一些列表?
Python中是否存在解析列表中的地址的librairy?你会推荐一个吗?
答案 0 :(得分:2)
(编辑)
实际上你不需要任何额外的库。这是一个简单的操作,如果你可以用单个字符分割,可以使用列表推导或生成器或map
函数和split
,strip
str
对象方法
with open(sys.argv[1]) as f:
lines = f.readlines()
split = lambda x: x.replace(',', '').split()
addresses_lists = map(split, lines)
如果要分割更复杂的条件 - 使用re
模块来解析所需的模式。当然你需要split
function from re
module。
答案 1 :(得分:2)
您可以存储此数据的各种数据结构。您可以将每行中的数据存储在包含(city_name,street_number,street_type,street_name)的元组中,然后将每个元组存储到列表中。一个稍微好一点的选择是将数据存储到字典列表中。这是一个简短的演示。
fname = 'citydata.txt'
addresses = []
keys = ('city', 'num', 'type', 'name')
with open(fname) as f:
for line in f:
line = line.rstrip()
city, line = line.split(',', 1)
num, street_type, street_name = line.split(None, 2)
t = (city, num, street_type, street_name)
print(t)
addresses.append(dict(zip(keys, t)))
print()
for row in addresses:
print(row)
print()
for row in addresses:
print(row['num'])
<强>输出强>
('Paris', '458', 'boulevard', 'Saint-Germain')
('Paris', '343', 'boulevard', 'Saint-Germain')
('Marseille', '343', 'boulevard', 'Camille Flammarion')
('Marseille', '29', 'rue', 'Camille Desmoulins')
('Marseille', '1', 'chemin', 'des Aubagnens')
{'city': 'Paris', 'num': '458', 'type': 'boulevard', 'name': 'Saint-Germain'}
{'city': 'Paris', 'num': '343', 'type': 'boulevard', 'name': 'Saint-Germain'}
{'city': 'Marseille', 'num': '343', 'type': 'boulevard', 'name': 'Camille Flammarion'}
{'city': 'Marseille', 'num': '29', 'type': 'rue', 'name': 'Camille Desmoulins'}
{'city': 'Marseille', 'num': '1', 'type': 'chemin', 'name': 'des Aubagnens'}
458
343
343
29
1