2017-04-09 65 views
0

初学程序员在这里。我有一个csv文件。一列包含日期,另一列包含一个字符串,表示“缺席”或“现在”。 (日期也是一个字符串)我应该在什么数据结构中组织数据?

我想要完成的是将出现在特定日期的孩子数量的百分比分组。

于是想也许为例最后的结果我有一个包含日期和同学认为参加像这样

Attendance = [[08/22/2016, 89.013],[08/26/2016, 84.33]] 

唯一的问题是我不知道的百分比列表的列表知道如何达到这一点。

难道有人会告诉我如何从A点到B点?

编辑:这个例子让我们说

file_o = open(csvFile, 'r') 
csvF = csv.reader(file_o) 
for line in csvF: 
    line[0] # contains date 
    line[1] # contains 'Absent' or 'Present 
+2

这是一个非常广泛的问题。有几种方法可以做到这一点。把任务分解下来;你能够将csv数据读入python列表(步骤1)吗?你应该在许多小的原子步骤中查看A→B,并逐个解决这些问题。 – roganjosh

+0

添加几行示例CSV文件和一个读取它的python程序 - 即使该程序完全损坏。试试csv模块。 – tdelaney

+0

你可以使用'dict',其中键是日期,值是一个不存在/存在的列表。阅读csv的每一行并更新字典。然后再次运行该词典并用当前百分比替换它的列表。 – tdelaney

回答

1

一个dict似乎是最简单的方法。使用它来记录每个日期的当前/缺失值列表,然后对它们进行求和。由于您只需要某些日期,因此我已使用这些日期初始化跟踪字典,并忽略其他日期。

(注:更新到工作示例)

import csv 

# write a test file 
open('mytest.csv', 'w').write("""08/22/2016,Present,Fiona 
08/22/2016,Absent,Ralph 
08/23/2016,Present,Fiona 
08/23/2016,Absent,Ralph 
08/24/2016,Present,Fiona 
08/24/2016,Absent,Ralph 
08/25/2016,Present,Fiona 
08/25/2016,Absent,Ralph 



""") 

# initialize tracker with wanted dates. 
wanted_dates = ['08/22/2016', '08/25/2016', '08/30/2016'] 
tracker = {wanted:[] for wanted in wanted_dates} 

with open('mytest.csv', newline='') as fp: 
    reader = csv.reader(fp) 
    for row in reader: 
     if row: 
      date = row[0] 
      # only add wanted dates 
      if date in tracker: 
       present = row[1].lower() 
       tracker[date].append(present == 'present') 

# create final report. make a copy of tracker's values because we 
# will change tracker during enumeration. 
for date, present_list in tracker.items(): 
    if not present_list: 
     # no data, so show 0 
     present_list = [0] 
    tracker[date] = float(sum(present_list))/len(present_list) * 100 

for date, percent in sorted(tracker.items()): 
    print('{} {:2.2f}'.format(date, percent)) 
+0

非常感谢您的回复,当我在我的程序中尝试代码时,我得到一个ValueError:太多值来解压缩。还假设我已经有了一个特定的日期列表,我需要在该文件中查找日期列表,然后将日期和“Present”和“Absent”列表“附加”到字典中,这也可以解决ValueError,因为它 – yessir1324

+0

另外我的程序告诉我,end =''是一个无效的关键字参数,所以我用'r'取代了它,这可以吗? – yessir1324

+0

这应该是''newline ='''(我正在怂恿你使用python 3),我有时会在'print'和'open'之间混淆......你会认为他们会使用相同的名字。你可以测试行的长度,因为csv也会读取空行,你可以把想要的日期放在一个集合中,并在添加到字典之前检查包含的内容。 – tdelaney

相关问题