我正在研究一个Python项目。我有一个分号加新行分隔的文本文件,正在读取包含所有50个状态(包括DC)。因此,每个州都有自己的行以分号(;
)结尾。一个例子如下。我还有另外一个文件,其中包含大量信息。 The text document can be found here
我想跳过任何以州名开头的行,通过对所有50个州的文本文件以及任何此类行下面的行进行测试。我不需要这些信息。有没有办法逐行测试,如果它以州名开头,如果它与另一个文本文件中的50个状态之一匹配,跳过该行加上它下面的行?
例如,在超链接文本文件中,行43
以Alaska
开头。我想跳过那一行和它下面的一行。我想将其余信息存储在一个数组中。当我点击行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 = ';')
答案 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)