簡體   English   中英

比較兩個文本文檔並根據一個文本文檔跳過某些行 - Python

[英]Comparing two text documents and skipping certain lines based off of one text document - Python

我正在做一個 Python 項目。 我有一個分號加換行符分隔的文本文件,正在讀取該文件,其中包含所有 50 個州(包括 DC)。 因此,每個狀態都有自己的行,以分號 ( ; ) 結尾。 下面是一個例子。 我還有另一個文件被讀入了大量信息。 可以在此處找到文本文檔

我想通過針對包含所有五十個州的文本文件以及任何此類行下方的行進行測試來跳過以州名開頭的任何行。 我不需要這些信息。 有沒有辦法逐行測試它是否以州名開頭,並且如果它與另一個文本文件中的五十個州之一匹配,則跳過該行及其下方的行?

例如,在超鏈接文本文件中,第43行以Alaska開頭。 我想跳過該行及其下方的行。 我想將其余信息存儲在一個數組中。 當我點擊第244行時,下一個州( Alabama )的信息開始。 我想跳過第244行及其下方的行,並執行相同的操作 - 將所有信息存儲在數組中,最后編譯一個大數組。

這是五十個州文件的前四行:

Alabama; 
Alaska;
Arizona; 
Arkansas;

為了澄清起見,我唯一感興趣的信息是 ICAO 數據,它是超鏈接文本文件中的第 3 列。

另外,如果沒有特定線路的國際民航組織信息,這會是一個問題嗎? 例如,超鏈接文本文檔中的第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 = ';')

我很確定這只是打破你的顧慮的問題。 首先,您只想加載一次“狀態名稱文件”:

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

現在,我們需要遍歷 ICAO 數據中的每一行:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM