如何将txt文件解析为Python中的列表

时间:2016-07-01 11:00:22

标签: python python-3.x

我离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个问题:

  1. 如何为每种类型(City,number,streetType,streetName)制作一些列表?

  2. Python中是否存在解析列表中的地址的librairy?你会推荐一个吗?

2 个答案:

答案 0 :(得分:2)

(编辑)

实际上你不需要任何额外的库。这是一个简单的操作,如果你可以用单个字符分割,可以使用列表推导或生成器或map函数和splitstrip 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