繁体   English   中英

值:解压的值太多(预期 18)

[英]Values: too many values to unpack (expected 18)

我试图用代码完成三件事,但我一直卡在第一步:

  1. 已清除 csv 文件中每一列的列表。 专门针对indicator geocode geoarea timeperiodvalue 在这里,我不断得到太多的值来解包错误。 有18列。 我尝试包括tryexcept ,但是当有更多的时候我的列表被限制为 384 行。 您对解决方法有什么想法吗?

  2. 为每一行创建列表

  3. 过滤并选择最近一年的列表 2015

这是我一直在使用的数据: https ://github.com/guillermocubells/sdg9b1_642

innovation_9b1 = open('Indicators_9_6.csv','r' , encoding = 'utf-8' , errors= 'ignore') 

innovation_9b1.readline()
indicator= []
geocode = []
geoarea = []
timeperiod= []
value = []  
for lines in innovation_9b1:
    _,_,i,_,_,g,a,tp,v,_,_,_,_,_,_,_,_,_,= lines.strip().split(',')
    indicator.append(i)
    geocode.append(g)
    geoarea.append(a)
    timeperiod.append(tp)
    print(lines)

鉴于您正在使用的变量,您最好这样:

for lines in innovation_9b1:
    elements = lines.strip().split(',')
    indicator.append(elements[2])
    geocode.append(elements[5])
    geoarea.append(elements[6])
    timeperiod.append(elements[7])
    print(lines)

您也可以使用Python 的csv模块,而不是手动解析 CSV,它允许您将 CSV 解析为列表或字典。

例如,由于您的数据有标题,您可以使用csv.DictReader将其解析为可以通过标题寻址的字典。 在此示例中, csv.Sniffer用于确定您正在使用的 CSV 格式类型——我不确定它是什么。

import csv

indicator = []
geocode = []
geoarea = []
timeperiod = []
value = []  
with open('Indicators_9_6.csv', 'r', encoding='utf-8', errors='ignore') as innovation_9b1:
    dialect = csv.Sniffer().sniff(innovation_9b1.read())
    dialect.skipinitialspace = True
    innovation_9b1.seek(0)
    reader = csv.DictReader(innovation_9b1, dialect=dialect)
    for row in reader:
        indicator.append(row["Indicator"])
        geocode.append(row["GeoAreaCode"])
        geoarea.append(row["GeoAreaName"])
        timeperiod.append(row["TimePeriod"])
        print(row)

正如我在我的一条评论中所说,这对pandas来说是一个很好的例子:

import pandas as pd
from pathlib import Path

csv_file = Path('Indicators_9_6.csv')

delete_columns = [
    'Goal',
    'Target',
    'SeriesCode',
    'SeriesDescription',
    'Value',
    'Time_Detail',
    'UpperBound',
    'LowerBound',
    'BasePeriod',
    'Source',
    'FootNote',
    'Nature',
    'Units',
    '[Reporting Type]'
]

df = pd.DataFrame(
    pd.read_csv(
        csv_file,
        encoding='iso-8859-1',
        skipinitialspace=True
    )
)
df.drop(delete_columns, axis=1, inplace=True)

或者,您可以只阅读所需的列:

import pandas as pd
from pathlib import Path

csv_file = Path('Indicators_9_6.csv')

columns = [
    'Indicator',
    'GeoAreaCode',
    'GeoAreaName',
    'TimePeriod'
]

df = pd.DataFrame(
    pd.read_csv(
        csv_file,
        encoding='iso-8859-1',
        skipinitialspace=True,
        usecols=columns
    )
)

之后很容易通过名称引用任何列:

>>> df.Indicator
0       6.4.2
1       6.4.2
2       6.4.2
3       6.4.2
4       6.4.2
        ...  
3529    9.b.1
3530    9.b.1
3531    9.b.1
3532    9.b.1
3533    9.b.1
Name: Indicator, Length: 3534, dtype: object
>>> 

这是一个概念证明:

Python 3.7.5 (default, Oct 17 2019, 12:16:48) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> from pathlib import Path
>>> 
>>> csv_file = Path('Indicators_9_6.csv')
>>> 
>>> columns = [
...     'Indicator',
...     'GeoAreaCode',
...     'GeoAreaName',
...     'TimePeriod'
... ]
>>> 
>>> df = pd.DataFrame(
...     pd.read_csv(
...         csv_file,
...         encoding='iso-8859-1',
...         skipinitialspace=True,
...         usecols=columns
...     )
... )
>>> df
     Indicator  GeoAreaCode  GeoAreaName  TimePeriod
0        6.4.2            4  Afghanistan        2000
1        6.4.2            4  Afghanistan        2005
2        6.4.2            4  Afghanistan        2010
3        6.4.2            4  Afghanistan        2015
4        6.4.2            8      Albania        2000
...        ...          ...          ...         ...
3529     9.b.1          894       Zambia        2012
3530     9.b.1          894       Zambia        2013
3531     9.b.1          894       Zambia        2014
3532     9.b.1          894       Zambia        2015
3533     9.b.1          894       Zambia        2016

[3534 rows x 4 columns]
>>> 

我希望它有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM