【问题标题】:Is there a way in python to assign variables values from a line that's read inpython中有没有办法从读入的行中分配变量值
【发布时间】:2014-02-11 22:16:39
【问题描述】:

对不起,如果我在 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 显示变量“行”,除了所有空格都被删除了。不确定 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)

【问题讨论】:

  • 能否提供“data.txt”的内容?
  • 旁白:当您在写入文件时可以简单地引用tokens[0]tokens[1]tokens[2] 时,将唯一变量分配给tokens 的每个索引是多余的。
  • 您确定该行实际上是用空格而不是制表符分隔的吗?因为如果没有实际的空格,line.split(' ') 将返回一个包含一个元素的列表,即整行。这正是您所看到的。
  • 另外,一般来说,不要说“给我一个超出范围的消息”;使用回溯粘贴实际的异常。即使那些 gobbledegook 对你没有任何意义,但它通常对那些试图帮助的人来说意义重大。 (在这种情况下可能不会,但除非您真正理解错误,否则不要认为它们没有用。)
  • 顺便说一句:line.rstrip() 没有做任何有用的事情,因为rstrip() 不修改字符串,它返回一个新字符串。 (事实上​​,nothing 在 Python 中修改字符串;它们是不可变的。)所以,line = line.rstrip()tokens = line.rstrip().split(' ') 就是您想要的。但无论哪种方式,这都不会导致您的问题。

标签: python shell unix


【解决方案1】:

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

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() 返回一个字符串,而不改变原来的。

【讨论】:

  • 顺便说一句:在 Python 3.x 中,file 不是内置类型或构造函数;在 2.x 中,它是,但不鼓励您参考它。因此,这并不像使用 listdict 作为变量名那么糟糕。
  • 但是与此同时,这都是很好的建议,并且很好地解释了开机......但他没有一个解决他的问题(这似乎是他的line.split(' ')返回一个只有1个元素的列表),所以这真的不是答案。
  • @abarnert:我之前没有注意到这一点。请检查编辑
  • 我认为编辑也不能解决他的问题。他清楚地相信他的文件中的每一行正好有 2 个空格,但几乎可以肯定它们有 no 个空格,否则他不会得到这些错误。这意味着您的代码将只复制原始文件不变,而不是引发异常。 (真的,在他真正向我们提供他的数据之前,我认为任何人都不可能解决这个问题,除非通过疯狂的猜测......)
  • 感谢您的提示。当我在 python 中编码时,我会尽量记住它们。
【解决方案2】:

代码:

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 不是字符串,但我认为您可以将其更改为您想要的任何格式。:-)

【讨论】:

  • 这到底是为了解决什么问题?他在var2 = tokens[1] 上收到IndexError。您的代码将引发完全相同的IndexError。考虑到他只期望三个令牌,而实际上只得到一个,他忽略第三个以外的任何令牌这一事实似乎并不重要。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    怎么样:

    #!/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 等更具描述性的变量名称。

    【讨论】:

    • 这如何解决问题?要么它只是因为断言而不是IndexError 而失败,要么它碰巧因为你没有解释的原因而幸运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多