我试图利用列表理解来从非常大的文件中对数据进行排序。文件结构如下:
<div class="control-group">
<label class="control-label" for="form-field-1">Network</label>
<div class="controls">
<select id="a_network" name="a_network" onchange="getplan();">
<option>Choose Network</option>
<?php
$q=mysql_query("select * from network");
while($rq=mysql_fetch_array($q))
{
?>
<option value="<?php echo $rq['id'];?>"><?php echo $rq['network_name'];?></option>
<?php
}
?>
</select>
</div>
</div>
<div class="control-group">
<label class="control-label" for="form-field-1">Plan</label>
<div class="controls">
<select id="plan" name="plan"></select>
</div>
</div>
<script>
function getplan()
{
var network_id = $("#a_network").val();
$("#plan").empty();
if(network_id != ''){
$.ajax({
type: "post",
url: "getPlanbyNetworkID.php",
data: {network_id: network_id},
dataType: "html",
success: function(data) {
$("#plan").append(data);
});
}
}
</script>
......等等。
基本上尝试将所有info1收集到一个列表中,将所有info2收集到另一个列表中。我有一个以前的脚本,这样做,但它很慢。我也试图使其面向对象,这样我就可以更有效地使用数据。
旧脚本:
<?php
$network_id = $_POST['network_id'];
$q=mysql_query("select * from sim_plans where network_id='$network_id'");
$dropdown = '<option>Choose Plan...</option>';
while($rq=mysql_fetch_array($q))
{
$dropdown .= '<option value="' . $rq['plan_id'] . '">' . $rq['plan'] . '</option>';
}
echo $dropdown;
?>
新脚本:
THING
info1
info2
info3
THING
info1
info2
info3
新脚本适用于将info1_data作为列表获取。但是,要获取info2_data,我找不到使用此方法跳过2行的任何内容。我猜到了info1_data = []
info2_data = []
with open(myfile) as f:
for line in f:
if re.search('THING',line):
line=next(f)
info1_data.append(line)
line=next(f)
info2_data.append(line)
。它运行但没有产生任何东西。
这可能吗?
非常感谢。
在摩西的帮助下我找到了这个解决方案。但islice非常令人困惑,即使在阅读了python.docs之后我也完全不了解它。 iterable是否获取数据(即info1或info2)或者启动,停止和步骤是否指示提取哪些数据?
islice(可迭代,开始,停止[,步骤])
def __init__(self, file):
self.file = file
def sort_info1(self):
with self.file as f:
info1_data = [next(f) for line in f if re.search('THING',line)]
return info1_data
def sort_info2(self):
with self.file as f:
info2_data = [next(f).next(f) for line in f if re.search('THING',line)]
return info2_data
答案 0 :(得分:2)
您应该将seek
文件返回到开头,以便从文件开头重复搜索。此外,您可以使用生成器函数将搜索操作与数据生成分离。然后使用itertools.islice
跨越行:
from itertools import islice
class SomeClass(object):
def __init__(self, file):
self.file = file
def search(self, word):
self.file.seek(0) # seek to start of file
for line in self.file:
if re.search(word, line):
# yield next two lines
yield next(self.file)
yield next(self.file)
def sort_info1(self):
return list(islice(self.search('THING'), 0, None, 2))
def sort_info2(self):
return list(islice(self.search('THING'), 1, None, 2))
然而,我建议您不要传递文件,而是将路径传递给文件,以便每次使用后文件都可以关闭,以避免在资源不足时(或者尚未)。
答案 1 :(得分:1)
你可以这样做:
def sort_info2(self):
with self.file as f:
info2_data = [(next(f),next(f))[1] for line in f if re.search('THING',line)]
return info2_data
但它看起来有点奇怪!