比较两个文本文档并根据一个文本文档跳过某些行 - Python

时间:2016-03-10 00:50:46

标签: python

我正在研究一个Python项目。我有一个分号加新行分隔的文本文件,正在读取包含所有50个状态(包括DC)。因此,每个州都有自己的行以分号(;)结尾。一个例子如下。我还有另外一个文件,其中包含大量信息。 The text document can be found here

我想跳过任何以州名开头的行,通过对所有50个州的文本文件以及任何此类行下面的行进行测试。我不需要这些信息。有没有办法逐行测试,如果它以州名开头,如果它与另一个文本文件中的50个状态之一匹配,跳过该行加上它下面的行?

例如,在超链接文本文件中,行43Alaska开头。我想跳过那一行和它下面的一行。我想将其余信息存储在一个数组中。当我点击行244时,将开始下一个州(Alabama)的信息。我想跳过行244和下面的行,并做同样的事情 - 将所有信息存储在数组中,最后编译一个大数组。

以下是五十州档案的前四行:

Alabama; 
Alaska;
Arizona; 
Arkansas;

为了澄清,我唯一感兴趣的信息是ICAO数据,它是超链接文本文件中的第3列。

此外,如果特定线路没有ICAO信息,是否会成为一个问题?例如,超链接文本文档中的行63没有值。

这是我到目前为止的代码:

import numpy as np
#This program reads in the ICAO data file found at: http://weather.rap.ucar.edu/surface/stations.txt

with open('ICAOlist.txt','r') as dataICAO:
     icaoData = np.loadtxt(dataICAO, dtype = str, delimiter = ' ', skiprows = 41)
     with open('listOfAllStates.txt', 'r') as dataStates:
         statesData = np.loadtxt(dataStates, dtype = str, delimiter = ';')

1 个答案:

答案 0 :(得分:1)

我很确定这只是打破你的担忧的问题。首先,您只想加载“州名称文件”一次:

# Get all the states as an array
def load_states(statesFile):
    with open(statesFile, 'r') as states:
        return np.loadtxt(states, dtype = str, delimiter = ';') 

现在,我们需要浏览国际民航组织数据的每一行:

def load_icao_data(state_filename, icao_filename):
    states = load_states(state_filename)
    with open(icao_filename, 'r') as input:
        previous_line = None
        for line in input:
            if valid_line(line, states) and valid_line(previous_line, states):
                process_line(line)
            previous_line = line

您必须编写的两个函数是valid_line(应返回bool)和process_line(应该对数据执行任何操作)。

valid_line应该列出状态列表以及当前行。它看起来像这样:

def valid_line(line, states):
    if not line or len(line) == 0:
        return True  # if the line is empty or None
    for state in states:
        if line.startswith(state):
            return False
    return True

process_line留给您确定。有意义吗?

附录:

我在实际数据中注意到state并不是确定某条线是否“坏”的原因。您可以将valid_line重写为:

def valid_line(line):
    return len(line) > 3   # Eliminates short/empty lines
        && line[0] != '!'  # Eliminates 'comment' lines
        && line[2] == ' '  # Eliminates 'state title' lines
        && line[3] != ' '  # Eliminates 'header column' line

然后您的load_icao_data变为:

def load_icao_data(icao_filename):
    with open(icao_filename, 'r') as input:
        for line in input:
            if valid_line(line):
                process_line(line)