Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 要解压缩的值太多(预计4个)_Python_List_Line - Fatal编程技术网

Python 要解压缩的值太多(预计4个)

Python 要解压缩的值太多(预计4个),python,list,line,Python,List,Line,我有一段基本代码,只是想把一个文件分成4个列表。txt文件的格式如代码下面所示,每个数字之间用空格分隔。出现的错误是“ValueError:要解压缩的值太多(应为4)” 但是,我将代码更改为如下所示,以测试预期的变量数量,错误更改为“没有足够的值来解包(预期5,得到4)”。这没有意义,因为现在代码正在解压我想要的四个变量!如有任何解决方案/建议,将不胜感激 file = open("myfreefall.txt","r") for line in file: if not line.s

我有一段基本代码,只是想把一个文件分成4个列表。txt文件的格式如代码下面所示,每个数字之间用空格分隔。出现的错误是“ValueError:要解压缩的值太多(应为4)”

但是,我将代码更改为如下所示,以测试预期的变量数量,错误更改为“没有足够的值来解包(预期5,得到4)”。这没有意义,因为现在代码正在解压我想要的四个变量!如有任何解决方案/建议,将不胜感激

file = open("myfreefall.txt","r")
for line in file:
     if not line.startswith('#'):
         v,a,t,y,test= line.split(' ')

第二个错误是正确的,因为您正在按照此行解包5个值:

v,a,t,y,test = line.split(' ')
#       ^^^^
由于拆分时每行将返回4个元素,因此不存在第5个值,因此会出现错误。请注意,从长远来看,使用这种方式解包可能会有问题,特别是对于许多元素。对分割线的长度进行显式检查可能值得一试

对于原始问题,尝试使用行.SPLIT()/Code >,因为这会自动分割空白区——也就是说,空间可能是一个标签,或者是空白Unicode字符之一(参见:)/< 或者,可以在行中使用正则表达式,以简化对文本的解析:

import re

regex = re.compile('([-+]?[0-9]*\.[0-9]+|[0-9]+)')  # regex for floating-point numbers
matches = regex.findall(line)  # `matches` will return a list

正如评论员所建议的,尝试打印该行以查看实际导致问题的行(但请确保在
行.split
之前插入打印内容)

最可能的问题是结尾处有一个空行,它被读取为换行符。如果是这样,最简单的解决方案可能是在If语句中附加另一个条件:

file = open("myfreefall.txt","r")
for line in file:
     if not line.startswith('#') and line != '\n':
     # or, more robust:
     if not line.startswith('#') and len(line) == 4:
         v,a,t,y= line.split(' ')
或使用try/except:

file = open("myfreefall.txt","r")
for line in file:
    try:
       v,a,t,y= line.split(' ')
    except ValueError:
       continue
       # Skip over this line if the extraction fails
第二个if语句更健壮,因为它只会在有四个列表条目要处理的情况下尝试提取四个变量。任何其他情况(要从中提取的条目数量或数量)都将被忽略。您可以根据自己的需要对其进行更多的调整,例如,如果您想允许读取更长的行,可以将其更改为“len(line)>=4”

老实说,我想不出try/except变体有什么特别的优势,但既然我刚刚写了出来,我还是把它留在里面吧。事实上,它可能有点过于健壮,因为它也会跳过导致ValueErrors的行,而不是因为要处理的条目太少

正如你所描述的,你的第二次尝试失败是完全有道理的。
您告诉python将包含四个条目的列表拆分为五个变量:v、a、t、y和test。这就是错误所指的“期望5,得到4”。您的错误行为可能会改变,因为代码现在很快就会失败。之前,它适用于除最后一行之外的所有行,其中只有一个列表条目可供使用。更改为五个变量会导致第一行出现错误,其中有四个条目,但现在您要求五个。

为什么不直接打印line.split()以查看您得到了多少?它阻塞了哪一行?试着打印行以查看。您的文本文件的格式与您认为的不一致。并检查/打印除套件中的相关数据,如
。这应该会让你了解正在发生的事情。
file = open("myfreefall.txt","r")
for line in file:
    try:
       v,a,t,y= line.split(' ')
    except ValueError:
       continue
       # Skip over this line if the extraction fails