我必须构建一个自动化测试场景,我需要在网页中填充多个字段。填充特定字段的数据来自文本文件
in1=data1,in2=data2,in3=data3
in11=data11,in12=data12,in13=data13
in21=data21,in22=data22,in23=data23
其中每个键/值对由逗号分隔。
我需要逐行读取此文件,并将每个键/值对分配给其唯一变量。 一旦将键/值对分配给唯一变量,我将这些变量作为参数传递给python脚本,该脚本使用参数构建字典对象并将其交给http请求。
我已经完成了一个python脚本,该脚本使用python数组而不是文本文件来读取键/值对,并成功将其传递给http请求并成功填充了网页中的字段。
但是,我需要能够从bash脚本中读取数据,以便我可以将值发送到python脚本
到目前为止,在bash脚本中,我可以从文件中读取并使用awk将每个键/值对打印到屏幕上。但是,当我逐行读取文本文件时,我需要能够将每个键/值对分配给变量。
最后我应该选择第一行:
var1 = in1, var2 = data1, var3 = in2, var4 = data2, var5 = in3, var6 = data3
现在,第一行传递给python脚本
%python python_script.py $var1 $var2 $var3 $var4 $var5 $var6
然后,从文本文件中读取下一行,并将键/值对分配给唯一变量,并将变量发送到python脚本。
while read line
do
echo $line | awk (Could not figure out the arguments for awk)
python python_script.py [parameter list]
done < input_file.txt
答案 0 :(得分:0)
f = open('/tmp/workfile', 'w')
f.readline()
是否存在阻止您使用python的标准文件对象方法的约束? http://docs.python.org/library/stdtypes.html#file-objects
with open("hello.txt") as f:
for line in f:
print line //here you can tokenize the line using an explode on comma
答案 1 :(得分:0)
好的,抓住你的座位。我将做出以下假设:
in1=data1,in2=data2,in3=data3
in11=data11,in12=data12,in13=data13
in21=data21,in22=data22,in23=data23
您的数据完全相同,每行只包含3个以逗号分隔的值
现在,关于您的要求:
最后我应该选择第一行:
var1 = in1, var2 = data1, var3 = in2, var4 = data2, var5 = in3, var6 = data3
现在,第一行传递给python脚本
%python python_script.py $var1 $var2 $var3 $var4 $var5 $var6
好的,这是完整的代码清单:
while read line
do
# split into pairs using cut
pair1=$(echo $line | cut -d ',' -f 1)
pair2=$(echo $line | cut -d ',' -f 2)
pair3=$(echo $line | cut -d ',' -f 3)
# split again into key/values using cut
key1=$(echo $pair1 | cut -d '=' -f 1)
value1=$(echo $pair1 | cut -d '=' -f 2)
key2=$(echo $pair2 | cut -d '=' -f 1)
value2=$(echo $pair2 | cut -d '=' -f 2)
key3=$(echo $pair3 | cut -d '=' -f 1)
value3=$(echo $pair3 | cut -d '=' -f 2)
params="$key1 $value1 $key2 $value2 $key3 $value3"
python python_script.py $params
done < "file.txt"
如果假设不正确或有任何需要解释,请在评论中回复。
答案 2 :(得分:0)
我不确定你需要什么,但是这个:
< input_file.txt sed 's/[^A-Za-z0-9]/ /g' | while read line
do
python python_script.py $line
done
将运行您的python_script.py
作为下一个:
python python_script.py in1 data1 in2 data2 in3 data3
python python_script.py in11 data11 in12 data12 in13 data13
python python_script.py in21 data21 in22 data22 in23 data23
这没关系?
ps:别担心,你的python有6个参数,不仅仅是1:)
答案 3 :(得分:0)
我意识到这是一个迟来的答案...但这可能对将来的访问者有用:
#!/bin/bash
argCounter=0
while IFS= read -r line
do
#echo "line is " $line
IFS=, read -a kvPairs <<< "$line"
#echo "there are " ${#kvPairs[@]} " kv pairs in this line"
for kvp in "${kvPairs[@]}"; do
#echo "kvp = " $kvp
IFS== read key value <<< "$kvp"
valVec[$argCounter]=$key
((argCounter++))
valVec[$argCounter]=$value
((argCounter++))
#echo "key: " $key "; value: " $value "; counter: " $argCounter
done
IFS=
done <$1
printf "python myScript "
for x in "${valVec[@]}"; do
printf "%s " $x
done
printf "\n"
它不假设每行的大小;它采用整个输入($1
),一次读取一行,然后以逗号分隔该行。
该拆分的结果被馈送到一个内部循环,该内部循环创建键/值对,并将其附加到数组中。有一些注释掉的echo
语句可用于监视发生的情况。
最后,该数组被打印出来。您可能还有其他使用方式。
对于给定的输入文件,输出为
python myScript in1 data1 in2 data2 in3 data3 in11 data11 in12 data12 in13 data13 in21 data21 in22 data22 in23 data23
我相信这是所要的。