从文本文件中逐行读取并将每个值分配给特定变量

时间:2011-05-13 04:00:42

标签: bash

我必须构建一个自动化测试场景,我需要在网页中填充多个字段。填充特定字段的数据来自文本文件

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

4 个答案:

答案 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 

我相信这是所要的。