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

2024-10-01 01:38:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我离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

该文件包含:城市、街道编号、街道类型和街道名称

这个顺序总是一样的,城市后面跟一个逗号。你知道吗

我已经这样做了:

#!/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']

似乎是要做的事,但现在我有两个问题:

  1. 如何为每种类型(城市、号码、街道类型、街道名称)列出一些列表?

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


Tags: 文件类型sys街道parisdesruesaint
2条回答

您可以使用各种数据结构来存储这些数据。您可以将每行中的数据存储在一个元组中,该元组包含(city\u name、street\u number、street\u type、street\u 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

(编辑)

实际上你不需要任何额外的libs。这是一个简单的操作,可以通过列表理解或生成器或map函数和splitstripstr对象方法来完成,如果您可以按单个字符分割的话

with open(sys.argv[1]) as f:
    lines = f.readlines() 
    split = lambda x: x.replace(',', '').split()
    addresses_lists = map(split, lines)

如果您有更复杂的条件要分割-使用^{}模块来解析您需要的模式。当然你需要^{} function from ^{} module。你知道吗

相关问题 更多 >