专家Pythonistas,
问题如下:
我有一个用JSON制作的大型机AS / 400提取操作到一个长的&#39;要进一步切片/分弦的单个字符串(如果这是一个单词)。解析结果创建具有多个属性的模型实例。这些属性生成 <?php
$file = $_GET["file"];
$default_dir = $row["defaultdir"];
$path = $default_dir . $file;
$program_path = '/home/olimex/c/serial/src/sendfile';
$execution_path = $program_path . " " . $file;
echo "Program Path: " . $program_path . "<br>";
echo "Execution Path: " . $execution_path . "<br>";
echo "My file: " . $file . "<br>";
echo "Default Directory: " . $default_dir . "<br>";
echo "Full path: " . $path . "<br>";
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "/tmp/error-output.txt", "a") );
flush();
$process = proc_open($execution_path, $descriptorspec, $pipes, $cwd);
echo "<pre>";
if (is_resource($process)) {
while ($s = fgets($pipes[1])) {
print $s;
flush();
}
}
echo "</pre>";
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
?>
再次序列化(这是因为将来,数据源可能会发生变化,我需要在此级别维护抽象)。我从最近的研究中了解到,将OrderedDict()
(空字符串)属性/数据维护为''
的最佳方法是在将来进行最佳分析。
None
这是原始结果:
for i, line in enumerate(data_json):
swap_string += line['data']
if data_json[i] == data_json[-1] or data_json[i+1]['data'][1] == '_':
swap_list.append(swap_string)
swap_string = ''
然后,通过这个字符串,我有一张地图&#39;或者标题&#39;生成可以序列化切片的对象,等等:
_ D 958.860 L B NA0.000 010 N 001 U 0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 999 T00 000 99 999 -/- 001 BG/CODEBEDINGUNGEN : BG F04/F07/F20;
与此相比,我请求类实例化并创建这些属性:
slices = ['3:23', '23:24', '26:27', '29:38', '39:42', '43:46', '48:50', '51:52', '53:54', '55:58', '61:67', '72:79']
然后是问题:
我的问题是:使用带有切片定界的列表,如何使用for循环将对象实例化为应用列表推导的正确属性?是否也可以使用类中的属性进行循环?另外,使用简单的def __init__(self, bm=None, kg=None, abm_saa=None, la=None, lt=None,
bu_su=None, pos=None, hws=None, sp=None, r=None, p=None,
asa=None, em_ab=None, em_bis=None, benennung=None,
asb=None, t_a=None, vkfbez=None, pws1=None, qu1=None,
pws2=None, qu2=None, da=None, anz=None, t_b=None,
bg=None, code=None, pruef=None, add_info=None):
self.bm = bm
self.kg = kg
self.abm_saa = abm_saa...
语句将空字符串作为None
应用于对象?
if
答案 0 :(得分:1)
我没有看到切片数组中的值与它们上面显示的原始字符串之间的相关性,但根据其余的解释,我认为您可以按照以下步骤进行操作:
1)将slices数组转换为可用作字符串范围的数字形式:(如果每行数据的范围相同,则只执行一次)
ranges = [ (int(r[0]),int(r[1])) for r in [ s.split(":") for s in slices] ]
2)对于数据集中的每一行,请根据范围提取参数值:
params = [ [p,None][p==''] for p in [ line[start:end].strip() for start,end in ranges ] ]
# Note: [p,None][p==''] is a compact alternative to: None if p == '' else p
3)使用带有解包(*)的参数值列表来实例化模型对象:(这假设切片范围与构造函数的参数的顺序相同)
agr = PdsAGRMZDataModels(*params)
# Based on your sample data and slices this would produce seemingly
# misaligned data content.
#
# agr.bm == '958.860 L B NA0.000'
# agr.kg == None
# agr.abm_saa == '0'
# ...
[编辑]避免位置问题:
如果要解决参数位置/计数约束,可以使用切片定义的字典结构,以便提取的数据获得与函数参数匹配的关联名称。
例如:
slices = { 'kg':(3,23), 'bm':(23,24), 'xyz':(5,52) }
使用切片字典,行的数据也可以在字典中生成命名值:
data = { p:[v,None][v==''] for p,v in [(p,line[r[0]:r[1]].strip()) for p,r in slices.items()] }
然后,您可以使用inspect模块获取PdsAGRMZDataModels()构造函数的参数列表,并按正确的顺序将它们映射到您拥有的命名值(对于您没有的值,使用None) )。此映射将始终以适当的顺序生成正确数量的参数(与源数据无关)。
[编辑]:getargspec to getfullargspec
import inspect
params = [data[arg] if arg in data else None for arg in inspect.getfullargspec(PdsAGRMZDataModels).args[1:]]
# Note that, because we're calling a method, I'm dropping
# the first argument which corresponds to "self" and doesn't count.
通过这种方式,您可以使用任何源数据安全地调用模型构造函数,并且您的解决方案将更灵活地适应API更改或输入结构更改。如果您从同一数据中调用多个不同的函数(具有不同的参数名称),您甚至可以为同一个切片指定多个名称。
agr = PdsAGRMZDataModels(*params)
# The constructor gets bm= and kg= in the right order,
# and None for all other parameters.
# The xyz value is ignored since PdsAGRMZDataModels() has no such parameter.