我正在尝试将一个包含多行的txt文件拆分为单独的变量。文本是卷信息的输出,其中包含名称、数据大小等。我想将每个数据集拆分为特定变量,但似乎无法获得该变量
示例试图将此数据集拆分为每个项目的变量
/vol0 abcd4 Object RAID6+ 228.33 GB -- 400.00 GB Online
/vole1 abcd1 Object RAID6+ 44.19 TB 45.00 TB 45.00 TB Online
/vole2 abcd4 Object RAID6+ 11.27 TB 11.00 TB 12.00 TB Online
/vol3 abcd4 Object RAID6+ 9.50 TB -- 10.00 TB Online
/vol4 abcd1 Object RAID6+ 18.39 TB -- 19.10 TB Online
这是我运行的命令,但我一直收到关于“not enough values to unpack
“的错误。
inputfile = "dataset_input.txt"
with open(inputfile, "r") as input:
for row in input:
vol, bs, obj, raid, used, uunit, quota, qunit, q2, q2unit, status = row.split()
我可以通过下面的文本按空格分割文件,它可以工作。只是看起来不能把它放入单独的变量中,这样我就可以操纵数据集了
for row in input: #running through each row in the file
output_text = row.split() #split the row based on the default white-space delimiter
print(output_text)
我对python非常陌生,所以不确定这是否可行,也不确定它有多复杂
4条答案
按热度按时间x7yiwoj41#
首先你要做的是调用split方法,它会把你的行拆分成一个列表,对应字符串中的每一个空格,这会给你提供一个比你定义的变量数更长的列表,这只能通过拆分成你需要的变量数来解决。
其次,在每个for循环中,相同的变量将被重写为新值,从而丢失先前的迭代值,您可以通过将值追加到相应的变量数组中来解决此问题
下面是一个简单的解决方案,首先读取整个文本文件内容,对其进行预处理,然后将处理后的内容存储到所需的变量列表中
还要注意的是,可以根据主文本文件内容的生命周期要求,通过组合在预处理阶段追加的列表来改进代码
bkhjykvo2#
执行以下代码行时产生错误 *
not enough values to unpack
*:vol, bs, obj, raid, used, uunit, quota, qunit, q2, q2unit, status = row.split()
.原因是你正在从每行读取11个单独的元素,尽管看看你展示的例子,并不是每行都包含11个由空格分隔的单词。检查一下:输出:
你需要对你的数据集做一些清理或者也许长度上的if语句会有帮助。只看你提供的数据的一小部分,我看到标记**"--"意味着没有卷。所以你可以用一对有意义的变量替换"--"**标记(值+单位),例如0和任何单位。您可以这样做:
这就是输出
biswetbf3#
在我看来,你的数据是一个定长记录的列表,而不是使用
split()
,你可以根据你的定长字段来获取切片。Ultimatley,我会考虑使用pythonsstruct
来实现,但这可能会让你开始处理定长记录。让我们从文件中读取的一些示例数据开始,定义一个定长字段规范列表。
现在,给定数据行和字段定义,我们可以创建一个列表的列表。
这将为您提供:
如果可能的话,我自己更愿意使用
dict
的list
,因此,考虑到上面的数据和字段定义,我可能会这样使用它们......为您提供:
qyuhtwio4#
如果你想保持你原来的方法,像这样的东西将迎合有时只有10个'列'而不是预期的11个错误:
你当然可以把“--”改成任何你想要的。例如:
如果您愿意,还可以更改qunit中的“--”:
另一方面,在原始代码中,文件句柄是
input
。input
是Python的保留关键字;在代码中选择任何类型的标识符时,都应该避免这些问题。