Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中将txt文件解析为列表_Python_Python 3.x - Fatal编程技术网

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

如何在Python中将txt文件解析为列表,python,python-3.x,Python,Python 3.x,我离Python的新手不远了,我想解析一个文件 原样: 该文件包含:城市、街道编号、街道类型和街道名称 这个顺序总是一样的,城市后面跟一个逗号 我现在已经这样做了: #!/usr/bin/python3.4 import readline import sys try: f = open(sys.argv[1]) except:

我离Python的新手不远了,我想解析一个文件 原样:

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

这个顺序总是一样的,城市后面跟一个逗号

我现在已经这样做了:

#!/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']
似乎是要做的事情,但现在我有两个问题:

  • 如何为每种类型(城市、编号、街道类型、街道名称)列出一些列表

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

  • (编辑)

    实际上,你不需要任何额外的LIB。这是一个简单的操作,可以使用列表理解或生成器或
    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)
    
    若要拆分的条件更复杂,那个么使用模块来解析所需的模式。当然你需要。

    (编辑)

    实际上,你不需要任何额外的LIB。这是一个简单的操作,可以使用列表理解或生成器或
    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)
    

    若要拆分的条件更复杂,那个么使用模块来解析所需的模式。您肯定需要。

    有各种数据结构可以存储这些数据。您可以将每行中的数据存储在包含(城市名称、街道编号、街道类型、街道名称)的元组中,然后将每个元组存储到列表中。一个稍微好一点的选择是将数据存储到字典列表中。这里有一个简短的演示

    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
    

    您可以使用各种数据结构来存储这些数据。您可以将每行中的数据存储在包含(城市名称、街道编号、街道类型、街道名称)的元组中,然后将每个元组存储到列表中。一个稍微好一点的选择是将数据存储到字典列表中。这里有一个简短的演示

    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
    


    您熟悉Python吗?第一个问题:-如何为每个类型创建一些列表:---它已经是一个地址列表了。你还想要什么?我对它很陌生,但我有编程的基本知识,所以我想我可以检查一下并理解它。。我希望也许我忘了告诉你们,这个项目的目标是让我们从那个著名的.txt文件中得到的单词基本上自动完成。你真的想要一份门牌号的清单吗?例如,一个街道名称字典作为关键字,每个街道名称都有一个门牌号列表可能很有用。您熟悉Python吗?第一个问题:-如何为每种类型创建一些列表:---它已经是一个地址列表了。你还想要什么?我对它很陌生,但我有编程的基本知识,所以我想我可以检查一下并理解它。。我希望也许我忘了告诉你们,这个项目的目标是让我们从那个著名的.txt文件中得到的单词基本上自动完成。你真的想要一份门牌号的清单吗?例如,一个街道名称字典作为关键字,每个街道名称都有一个门牌号列表,这可能很有用。请注意,这并不会去掉城市名称的逗号。@PM2Ring,是的,它可以在使用map的更复杂的lambda之后进行处理。不必了,这两个答案都对我帮助很大,因为我对Python真的很陌生!我会尽我所能收集所有可能的信息!再次感谢大家@PM2Ring,但您有一个很好的观点和更明显的语法。这对学习有好处;)请注意,这并没有去掉城市名称的逗号。@PM2Ring,是的,它可以在使用map的更复杂的lambda之后或使用它进行处理。没有必要,这两个答案对我帮助很大,因为我对Python非常陌生!我会尽我所能收集所有可能的信息!再次感谢大家@PM2Ring,但您有一个很好的观点和更明显的语法。这对学习有好处;)多好的回答啊!谢谢,这真的帮助我理解了这个语言。最后一个问题是:我目前正在学习C和C++,我想知道是否有一种与C或C++一样的“错误处理”。我的意思是检查open()或其他函数的返回?非常感谢你的帮助!在Python中使用异常处理-请参阅@thomasbeudet:很高兴您喜欢我的答案。一旦你得到足够的分数,别忘了给它投票。:)是的,Python有异常处理。请参见Python在比C/C++更高的级别上工作。例如,我使用了
    来打开文件。如果
    with
    块中出现错误,则会自动关闭文件。在C语言中,你需要做更多的显式错误检查。多好的答案啊!谢谢,这真的帮助我理解了这个语言。最后一个问题是:我目前正在学习C和C++,我想知道是否有一种与C或C++一样的“错误处理”。我的意思是检查open()或其他函数的返回?非常感谢你的帮助!在Python中使用异常处理-请参阅@thomasbeudet:很高兴您喜欢我的答案。一旦你得到足够的分数,别忘了给它投票。:)是的,Python有异常处理。请参见Python在比C/C++更高的级别上工作。例如,我使用了
    来打开文件。如果
    with
    块中出现错误,则会自动关闭文件。在C语言中,您需要进行更多的显式错误检查。