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 パラメータによってキーが指定された dict にマップします。fieldnames パラメータを省略すると、csvfile の最初の行の値がフィールド名として使用されます。読み取られた行に fi​​eldnames シーケンスよりも多くのフィールドがある場合、残りのデータは、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 に答える