在python中是否有一种方法可以从读入的行中分配变量值

时间:2014-01-22 02:29:26

标签: python shell unix

很抱歉,如果我在python和unix shell脚本之间做出错误的假设。我还是语言新手。希望我能快速学习。

我想知道python中是否有一个等价行可以从unix shell脚本中为变量赋值?

例如,我们可以在unix shell脚本中执行此操作:

for line in $(cat file)
do
   IFS=' ' read var1 var2 var3 <<< "$line"
   echo "$var1, $var2, $var3" >> outfile
done

它用空格分隔线,并将第一个空格的所有内容分配到var1,在第一个空格和第二个空格之间分配到var2,然后将所有内容分配到var3。

我们可以在python中做同样的事情吗?我想我找到了python的东西,但是它没有用,可能是b / c我不知道我在做什么。 var2和var3给我一个超出范围的消息,打印var1显示变量“line”,除了删除所有空格。不确定rstrip或split是否对该行做了什么。在任何情况下,请提前感谢您的帮助,并且在我尝试学习python时不要嘲笑我;)

file = open('data.txt','r')
for line in file:
   line.rstrip()
   tokens = line.split(' ')
   var1 = tokens[0]
   var2 = tokens[1]
   var3 = tokens[2]
   outfile.write(var1 + "," + var2 + "," + var3)

4 个答案:

答案 0 :(得分:2)

是的,您可以使用元组解包语法:

a, b, c = (1, 2, 3)

可以使用如下:

with open('data.txt','r') as infile:
    for line in infile:
       line = line.rstrip()
       parts = line.split(' ')
       outfile.write(','.join(parts))  # now you don't have to worry about how many elements there are in each line

一些笔记(因为你自我认定为初学者):

  • 不要为您的变量filelistdict或任何其他内置类型命名。
  • 请参阅我在那里用过的with语法?这被称为上下文。它非常方便。这样,打开后我不必关闭文件。上下文经理为我照顾
  • 请注意,我做了line = line.rstrip()。那是因为rstrip()返回一个字符串,而不改变原始字符串。

答案 1 :(得分:0)

代码:

test_str = "aaa bbbb cccc dddd eeee"    
tokens = test_str.split(' ')  
if len(tokens) > 3:  
  var1 = tokens[0]
  var2 = tokens[1]
  var3 = tokens[2:]
>>> print(var1, '+', var2, '+', var3)
    aaa + bbbb + ['cccc', 'dddd', 'eeee']

var3不是字符串,但我认为您可以将其更改为您想要的任何格式。: - )

答案 2 :(得分:0)

我想我偶然发现了我正在寻找的东西。希望这也有助于其他人:

for line in fileOutput:
    var1, var2, var3, var4, var5, var6, var7 = line.rstrip().split(' ')

答案 3 :(得分:-1)

怎么样:

#!/usr/local/cpython-2.7/bin/python
#!/usr/local/cpython-3.3/bin/python

with open('data.txt','r') as infile, open('outfile.txt', 'w') as outfile:
    for line in infile:
        tokens = line.split()
        assert len(tokens) == 3
        fieldname1, fieldname2, fieldname3 = tokens
        outfile.write('{}.{}.{}\n'.format(fieldname1, fieldname1, fieldname3))

这在2.7或3.3上运行,没有任何变化。

您应该使用比fieldname1等更多的描述性变量名称。