尝试从 csv 生成字典但结果为空
Attempting to generate dictionary from csv but result is empty
这是我第一次 Stack Overflow post 所以请理解。我是 Python 的新手,正在尝试 Eric Matthes 的 Python 速成课程第 2 版中的练习 16-7,在那里我获得了一个 csv 数据集并创建了一个程序,将相关数据放入我可以的字典中然后制作一张地图来显示数据。
我的问题是我存储在要放入字典的变量中的数据似乎没有进入,使字典为空,从而阻止我创建地图来显示数据。希望您能从下面的代码中明白我的意思。
# data into list
filename = 'API_SP.DYN.TFRT.IN_DS2_en_csv_v2_1622869.csv'
with open(filename, encoding='utf-8-sig') as f:
reader = csv.DictReader(f)
next(reader)
next(reader)
for row in reader:
country_name = row['Data Source']
# '.strip() or 0' part used to ensure fertility data can be read into fertility without
# error caused by blank '' strings in the data.
# Has to be 'row[None]' to avoid KeyError
fertility = float(row[None][-4].strip() or 0)
code = get_country_code(country_name)
if code:
print(code + ': ' + str(fertility))
else:
print('ERROR - ' + country_name)
# build dictionary of population data
fertility_2018_data = {}
for row in reader:
country_name = row['Data Source']
fertility = float(row[None][-4].strip() or 0)
code = get_country_code(country_name)
if code:
fertility_2018_data[code] = fertility
当我尝试 'print(fertility_2018_data)' 时,我只得到一个空白的 {} 字典。
抱歉说了一大堆,但我想全面一点。这是在尝试了一些方法来修复它之后的代码,包括添加 'with open(filename, etc) as f:' 位,希望添加该部分可以使文件正确关闭。
坦率地说,我很困惑,到目前为止我在网上找到的任何其他东西都没有真正帮助我解决这个问题。如果需要,我可以尝试使用 link 编辑 post 到有问题的 .csv 文件,如果它有助于解决此问题。我认识到我的代码可能是混乱和低效的,所以任何其他批评也是可以的。
csv.DictReader returns 一个只能迭代一次的生成器对象。您已经在以下几行中对其进行了迭代。
for row in reader:
当您第二次使用“for row in reader”时,没有任何可迭代的内容。
我会使用的解决方案是将生成器中的所有内容存储到局部变量中。类似于:
local_var = []
for row in reader:
local_var.append(row)
然后在下游使用此 local_var。或者您可以再次初始化 reader 并将其连接到文件,然后填充“fertility_2018_data”。
这是我第一次 Stack Overflow post 所以请理解。我是 Python 的新手,正在尝试 Eric Matthes 的 Python 速成课程第 2 版中的练习 16-7,在那里我获得了一个 csv 数据集并创建了一个程序,将相关数据放入我可以的字典中然后制作一张地图来显示数据。
我的问题是我存储在要放入字典的变量中的数据似乎没有进入,使字典为空,从而阻止我创建地图来显示数据。希望您能从下面的代码中明白我的意思。
# data into list
filename = 'API_SP.DYN.TFRT.IN_DS2_en_csv_v2_1622869.csv'
with open(filename, encoding='utf-8-sig') as f:
reader = csv.DictReader(f)
next(reader)
next(reader)
for row in reader:
country_name = row['Data Source']
# '.strip() or 0' part used to ensure fertility data can be read into fertility without
# error caused by blank '' strings in the data.
# Has to be 'row[None]' to avoid KeyError
fertility = float(row[None][-4].strip() or 0)
code = get_country_code(country_name)
if code:
print(code + ': ' + str(fertility))
else:
print('ERROR - ' + country_name)
# build dictionary of population data
fertility_2018_data = {}
for row in reader:
country_name = row['Data Source']
fertility = float(row[None][-4].strip() or 0)
code = get_country_code(country_name)
if code:
fertility_2018_data[code] = fertility
当我尝试 'print(fertility_2018_data)' 时,我只得到一个空白的 {} 字典。
抱歉说了一大堆,但我想全面一点。这是在尝试了一些方法来修复它之后的代码,包括添加 'with open(filename, etc) as f:' 位,希望添加该部分可以使文件正确关闭。
坦率地说,我很困惑,到目前为止我在网上找到的任何其他东西都没有真正帮助我解决这个问题。如果需要,我可以尝试使用 link 编辑 post 到有问题的 .csv 文件,如果它有助于解决此问题。我认识到我的代码可能是混乱和低效的,所以任何其他批评也是可以的。
csv.DictReader returns 一个只能迭代一次的生成器对象。您已经在以下几行中对其进行了迭代。
for row in reader:
当您第二次使用“for row in reader”时,没有任何可迭代的内容。
我会使用的解决方案是将生成器中的所有内容存储到局部变量中。类似于:
local_var = []
for row in reader:
local_var.append(row)
然后在下游使用此 local_var。或者您可以再次初始化 reader 并将其连接到文件,然后填充“fertility_2018_data”。