【问题标题】:ValueError: need more than 0 values to unpackValueError:需要超过 0 个值才能解包
【发布时间】:2012-10-02 08:48:43
【问题描述】:

我是 python 新手,我正在尝试制作一个读取文件并将信息放入其自己的向量中的程序。该文件是一个 xyz 文件,如下所示:

45 

Fe -0.055 0.033 -0.047
N -0.012 -1.496 1.451
N 0.015 -1.462 -1.372
N 0.000 1.386 1.481
N 0.070 1.417 -1.339
C -0.096 -1.304 2.825
C 0.028 -1.241 -2.739
C -0.066 -2.872 1.251
C -0.0159 -2.838 -1.205

从第 3 行开始,我需要将每个向量放在自己的向量中,到目前为止,我有这个:

file=open("Question4.xyz","r+")
A = []
B = []
C = []
D = []
counter=0
for line in file:
    if counter>2: #information on particles start on the 2nd line
        a,b,c,d=line.split()
        A.append(a)
        B.append(float(b))
        C.append(float(c))
        D.append(float(d))
    counter=counter+1

我收到此错误:

 File "<pyshell#72>", line 3, in <module>
    a,b,c,d=line.split()
ValueError: need more than 0 values to unpack

关于我哪里出错了有什么想法吗?

提前致谢!

【问题讨论】:

  • 文件第一行的 45 是什么?你的文件是从那里开始的吗??
  • 45 是文件的一部分,但我只关心第 3 行及以下的信息
  • 出于兴趣,您为什么要分别创建 X 和 Y 坐标列表(以 B[15] C[15] D[15] 等形式访问),而不是您可以作为对象本身执行计算的 [x,y,z] 向量列表?正如@sberry 所说,我也不会像您那样将值解压缩到局部变量中;当您可以将拆分(列表)捕获到 tokens 变量并使用 tokens[1:] 访问时,这只是额外的不必要的代码(或者更好的是 [float(t) for t in tokens[1:]] 对于我提到的向量表示。)

标签: python string file


【解决方案1】:

看起来您的行中实际上并没有导致 4 项拆分。为此添加一个条件。

for line in file:
    spl = line.strip().split()
    if len(spl) == 4:  # this will take care of both empty lines and 
                       # lines containing greater than or less than four items
        a, b, c, d = spl
        A.append(a)
        B.append(float(b))
        C.append(float(c))
        D.append(float(d))

【讨论】:

  • 谢谢 - 这些额外的补充会有所帮助
  • 还有...如果len(spl) != 4 会怎样?你只是在不知情的情况下跳线。最好让你的代码发牢骚。
  • 那么您可以在else 部分中添加任何内容,在else 部分中处理该行。
【解决方案2】:

您是否会碰巧在某个地方有一个空行(或只有'\n')?

你可以强制

if counter >= 2:
    if line.strip():
        (a,b,c,d) = line.strip().split()

不检查您的分割线是否有 4 的 len 的一个优点是,如果它没有正确数量的字段(比如你体验过文件末尾的空行):您会得到一个异常,这会迫使您仔细检查您的输入(或您的逻辑)。

【讨论】:

  • 这对于包含'45'的第一行将失败。
  • @AshwiniChaudhary 这不会像 counter = 0 在那种情况下。
  • 函数的返回类型与函数中预期的值不匹配...检查函数返回的变量数和您期望的变量数
猜你喜欢
  • 2019-06-23
  • 2020-07-09
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
相关资源
最近更新 更多