【问题标题】:Extracting data from a text file as an array从文本文件中提取数据作为数组
【发布时间】:2020-07-21 11:30:28
【问题描述】:

我正在尝试从文本文件中提取某些数据字符串。 我使用的代码如下。我想从该文本文件中读取特定的字符串(所有操作),然后将其存储在数组或列表中(如果找到)。然后以相同的顺序显示。

import string 

solution_path = "/homer/my_dir/solution_detail.txt"
solution = open(solution_path).read()

all_actions = ['company_name','email_address','full_name']
n = 0
sequence_array = []
for line in solution:
            for action in all_actions:
                    if action in line:
                        sequence_array[n] = action
                        n = n+1
for x in range(len(sequence_array)):
            print (sequence_array[x])

但是这段代码没有做任何事情,只是运行没有任何错误。

【问题讨论】:

    标签: python arrays oop text-files text-extraction


    【解决方案1】:

    代码存在多个问题。

    1. .read() 对文件产生 single 字符串。因此,for line in solution: 会遍历文件文本的每个字符,而不是遍历每一行。 (名称line 并不特殊,以防您认为它是特殊的。迭代仅取决于被迭代的内容。)从文件中获取行的自然方法是循环 文件本身,当它打开时。为了保持文件打开并确保它正确关闭,我们使用了with 块。

    2. 您不能简单地分配给sequence_array[n],除非列表已经至少有n+1 元素长。 (你没有得到错误的原因是因为if action in line: 永远不会是真的,因为第一点。)幸运的是,我们可以简单地将.append 放到列表的末尾。

      李>
    3. 如果该行包含多个all_actions,它将被存储多次。这可能不是你想要发生的。内置的any函数让处理这个问题更容易;我们可以为它提供generator expression 以获得优雅的解决方案。但是,如果您的确切需求不同,那么当然有不同的方法。

    4. 虽然理论上最后一个循环是可以的,但直接循环是 better,与尝试循环 solution 的方式相同。但是,我们可以在找到结果时打印结果,而不是建立一个列表。

    所以,例如:

    with open(solution_path) as solution:
        for line in solution:
            if any(action in line for action in all_actions):
                print(line)
    

    【讨论】:

    • 非常感谢您的详细解释和澄清。你的代码也很完美。
    【解决方案2】:

    发生的事情是solution 包含文件中的所有文本。因此,当您迭代 for line in solution 时,实际上是在分别迭代每个字符,这就是为什么您永远不会得到任何命中的原因。

    尝试以下代码(我无法测试它,因为我没有你的文件)

    solution_path = "/homer/my_dir/solution_detail.txt"
    all_actions = ['company_name','email_address','full_name']
    
    
    sequence_array = []
    with open(solution_path, 'r') as f:
        for line in f.readlines():
            for action in all_actions:
                if action in line:
                    sequence_array.append(action)
    

    这将收集文档中的所有操作。如果你想全部打印出来

    for action in sequence_array:
        print(action)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多