1

我有一个文件codereview_stats.txt,其中包含以下格式的数据。顶部的日期表示数据写入文件的最后日期,并且用于我收集数据的方式。

18-09-2013
dd-mm-yyyy, questions, answers, %answered, users, visitors/day

15-09-2013,9381,15913,88,26972,8466
16-09-2013,9413,15949,88,27015,8466
17-09-2013,9426,15968,88,27041,8871
18-09-2013,9439,15995,88,27082,8934

我正在使用 matlotlib 绘制数据。但在此之前,我需要将日期、问题、答案等分成单独的列表。目前我正在get_data()如下所示的函数中执行此操作。如您所见,这里有许多列表推导。有没有更简单的方法将数据分成许多列表?

#! python3
from  matplotlib import pyplot as plt
from datetime import datetime as dt

def get_data():
    with open('codereview_stats.txt') as f:
        data = [line for line in f]

    data = [line[:-1].split(',') for line in data[3:]]

    dates = [dt.strptime(line[0], '%d-%m-%Y') for line in data]
    ques = [int(line[1]) for line in data]
    ans =  [int(line[2]) for line in data]
    perc = [int(line[3]) for line in data]
    users = [int(line[4]) for line in data]
    visits = [int(line[5]) for line in data]

    return dates, ques, ans, perc, users, visits


def show_plot(dates, ques, ans, perc, users, visits):
    plt.plot_date(dates, visits, '.', linestyle = '-')
    plt.grid(True)
    plt.setp(plt.xticks()[1], rotation=30)
    plt.show()


show_plot(*get_data())
4

2 回答 2

3

zip()*操作符一起可以用来解压一个列表:

>>> strs="""15-09-2013,9381,15913,88,26972,8466
... 16-09-2013,9413,15949,88,27015,8466
... 17-09-2013,9426,15968,88,27041,8871
... 18-09-2013,9439,15995,88,27082,8934"""
>>> lis = [line.rstrip().split(',') for line in strs.splitlines()]
>>> dates, ques, ans, perc, users, visits = zip(*lis)
>>> dates
('15-09-2013', '16-09-2013', '17-09-2013', '18-09-2013')
>>> ques
('9381', '9413', '9426', '9439')
...
于 2013-09-18T12:47:19.550 回答
1

stdlib 提供了csv读取逗号分隔文件的模块。还有一个DictReader可以满足您的要求:

class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

创建一个像普通阅读器一样操作的对象,但将读取的信息映射到一个字典,其键由可选的 fieldnames 参数给出。如果省略 fieldnames 参数,则 csvfile 第一行中的值将用作字段名。如果读取的行的字段多于 fieldnames 序列,则将剩余数据添加为由 restkey 的值作为键的序列。如果读取的行的字段少于 fieldnames 序列,则剩余的键采用可选的 restval 参数的值。任何其他可选或关键字参数都将传递给底层阅读器实例。

以下是它在您的应用程序片段中的样子(未经测试):

import csv

def get_data():
    d = csv.DictReader('codereview_stats.txt',
                       ['dates', 'ques', 'ans', 'perc', 'users', 'visits'])
    return d['dates'], d['ques'], d['ans'], d['perc'], d['users'], d['visits']

就个人而言,我会将代码更改为仅传递 dict object d

您在某处仍需要键入转换字符串的代码。这是关于如何继承 DictReader 以推断列上的类型的答案。

于 2013-09-18T14:15:05.270 回答