我正在处理需要拆分为词典的CSV文件数据。我使用以下代码:
ga_session_data = {}
ga_pageviews_data = {}
file = open('files/data.csv', 'r')
for line in file:
page, sessions, pageviews = line.split(',')
sessions = int(sessions.strip())
pageviews = int(pageviews.strip())
ga_session_data = {page: sessions}
ga_pageviews_data = {page: pageviews}
file.close()
print(ga_session_data)
print(ga_pageviews_data)
由于某种原因,我无法打印存储在循环外的字典中的所有数据。它只打印每行的第一行。
答案 0 :(得分:5)
您没有在初始的空字典中添加任何内容。您每次使用新词典替换:
ga_session_data = {page: sessions}
ga_pageviews_data = {page: pageviews}
这是两个新词典,每个词典都带有一个键值对。最后,在处理完文件中的最后一行之后,剩下的是文件中最后一行的信息,以及替换之前处理的所有内容。
如果要添加到初始词典,请使用分配键:
ga_session_data[page] = sessions
ga_pageviews_data[page] = pageviews
您可以将int()
转换为指派表达式:
for line in file:
page, sessions, pageviews = line.split(',')
ga_session_data[page] = int(sessions)
ga_pageviews_data[page] = int(pageviews)
请注意int()
并不关心数字周围的额外空格,因此不需要str.strip()
次调用。
接下来,我没有重新发明CSV读取轮;使用csv
module:
import csv
ga_session_data = {}
ga_pageviews_data = {}
with open('files/data.csv', 'r') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
page, sessions, pageviews = row
ga_session_data[page] = int(sessions)
ga_pageviews_data[page] = int(pageviews)
我还将文件对象用作上下文管理器,因此您不必再在其上明确调用file.close()
。
答案 1 :(得分:3)
正在打印整本字典。当您创建词典时,问题出在您的循环中:
ga_session_data = {page: sessions}
ga_pageviews_data = {page: pageviews}
这将在循环的每次迭代后创建一个新的字典,所以最后你必须有一个字典,其中最后一页对应于最后一个会话。
在循环中使用此语法:
ga_session_data = {}
ga_pageviews_data = {}
for line in file:
page, sessions, pageviews = line.split(',')
sessions = int(sessions.strip())
pageviews = int(pageviews.strip())
ga_session_data[page] = sessions
ga_pageviews_data[page] = pageviews
现在你的代码将添加到字典而不是简单地创建一个新字典。这是因为你在顶部定义了字典,循环结束时的语法是在同一个字典中创建一个新的键值对,而不是创建一个新的字典并将它分配给你以前的同一个变量
答案 2 :(得分:2)
在循环的每次迭代中,您都可以创建包含单个项目的新词典。
要解决此问题,请在for
循环内更改:
ga_session_data = {page: sessions}
ga_pageviews_data = {page: pageviews}
要:
ga_session_data[page] = sessions
ga_pageviews_data[page] = pageviews