質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

884閲覧

受け取った配列をcsvの指定の行の値と足し合わせたい。

pyamathon

総合スコア14

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/10/04 08:44

編集2021/10/06 23:04

前提・実現したいこと

クイズの回答結果を集計して表示するページを作成しています。
問題はランダムで30問ほど出題し問題番号1~30と振る予定です。
解答されると問題番号と正解不正解が1,0で配列化されます。
(例:問題番号1に正解→[1,1],問題番号19に不正解→[19,0])

発生している問題・エラーメッセージ

この回答結果をcsvに保存したいのですが、
指定の行数に合わせて行数に正解不正解を足したいです。
(例:問題番号1の累計正解数が100で今回正解した → [1,100]→[1,101]←100+1
→ [1,100,0]→[1,101,0]←100+1
問題番号19の累計正解数が100で今回不正解した → [1,100]→[1,100]←100+0)
→ [19,100,110]→[19,100,110]←100+0
(追記)ご指摘いただいた点を追記しました。
元のcsvは[問題番号,累計正解数,累計解答数]の情報になっています。
このcsvを読み込んで新たに書き込みたいです。
さらに、このあと入力回数を1足したいです。
→ [1,100,110]→[1,101,111]←110+1
→ [19,100,200]→[19,100,201]←200+1
該当のソースコードはあらかじめ配列(array2d)が与えられていますが、
この部分が送信されてくるデータになります。

該当のソースコード

cgi

1#!/usr/local/bin/python 2# -*- coding: utf-8 -*- 3import cgi 4import csv 5array2d =[[1,0],[2,1],[19,0]] 6with open('some.csv', 'w') as f: 7 writer = csv.writer(f, lineterminator='\n') # 改行コード(\n)を指定しておく 8 writer.writerows(array2d) # 2次元配列も書き込める 9print("Content-Type: text/html") 10print() 11htmlText = ''' 12<!DOCTYPE html> 13<html> 14 <head><meta charset="utf-8"></head> 15<body bgcolor="lightyellow"> 16 <h1>おつかれさま!</h1> 17 <hr/> 18 <a href="../form2.html">戻る</a>  19</body> 20</html> 21''' 22print(htmlText)

csv

11,0,0 22,0,0 33,0,0 4...

ご指摘いただいた点を追記、修正しました。

試したこと

同じような問題を扱っている情報が少なく書き込むしかできていません。
pandasを使用することも考えたのですが行に追記する方法が見つからず使えていません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/10/04 09:47

実行される形態はWEBのCGIなのでしょうが、プログラム本体はPython3スクリプトですから、"Python"や"Python 3.x"をタグに付けた方が回答を得やすいと思います。
pyamathon

2021/10/04 09:52

ご助言ありがとうございます。 修正させていただきました。
guest

回答1

0

ベストアンサー

質問文を読んで分からない所があります。

array2d =[[1,0],[2,1],[19,0]]
with open('some.csv', 'w') as f:
writer = csv.writer(f, lineterminator='\n') # 改行コード(\n)を指定しておく
writer.writerows(array2d)

上の箇所で書き込んでいるデータ (array2d) の1行あたりのデータ個数は2個ですが、CSVの1行あたりのデータ個数は

1,0,0
2,0,0
3,0,0

のように3個になっています。どちらが正しいのでしょうか?

指定の行数に合わせて行数に正解不正解を足したいです。
(例:問題番号1の累計正解数が100で今回正解した → [1,100]→[1,101]←100+1
問題番号19の累計正解数が100で今回不正解した → [1,100]→[1,100]←100+0)

累計正解数に今回の正解・不正解を足したいとのことですが、前回までの累計正解数はどこに記録されているのでしょうか? どこから読み取るのでしょうか?


間違っているところ。

print("Content-Type: text/html")
htmlText = '''
(...)
'''
print(htmlText)

レスポンスヘッダーとHTMLの間には空行が必要です。上記ですと空行がないのでエラーになります。以下のいずれかにしてください。

python

1print("Content-Type: text/html") 2print() 3htmlText = ''' 4(...) 5''' 6print(htmlText) 7 8# もしくは 9 10print("Content-Type: text/html\n") 11htmlText = ''' 12(...) 13''' 14print(htmlText)
<head><meta charset="utf-8\n\n"></head>

meta要素のcharset属性に改行は必要ありません。

html

1 <head><meta charset="utf-8"/></head>

でいいです。


以下の処理でやりたいことが実現できないでしょうか。

python

1sent_data = [[1, 0], [3, 1]] 2csv_data = [[1, 0, 0], [2, 0, 0], [3, 0, 0]] 3 4for answer in sent_data: 5 q_num, is_correct = answer 6 csv_data[q_num-1][1] = csv_data[q_num-1][1] + is_correct 7 8for q in csv_data: 9 q[2] += 1

以下は簡単なテストです。

python

1>>> sent_data = [[1, 0], [3, 1]] 2>>> csv_data = [[1, 0, 0], [2, 0, 0], [3, 0, 0]] 3>>> for answer in sent_data: 4... q_num, is_correct = answer 5... csv_data[q_num-1][1] = csv_data[q_num-1][1] + is_correct 6... 7>>> csv_data 8[[1, 0, 0], [2, 0, 0], [3, 1, 0]] 9>>> for q in csv_data: 10... q[2] += 1 11... 12>>> csv_data 13[[1, 0, 1], [2, 0, 1], [3, 1, 1]]

CSVファイルからのデータの読み込みは、以下の記事を参考にしていただけたらできると思います。

投稿2021/10/06 12:26

編集2021/10/07 01:44
etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pyamathon

2021/10/06 23:06

ご返信ありがとうございます。 ソースコードの修正をさせていただきました。 また、csvに関してはサーバー上にあるcsvの読み込みのあと、 2列目に正解数を、3列目に回答数を入力することで累計正解数にしたいです。 よろしくお願いします。
etherbeg

2021/10/06 23:13

回答するごとに3列目には+1、2列目は正解の時のみ+1ということですか?
pyamathon

2021/10/06 23:29

早速のご返信ありがとうございます。 そのようなことが実現したいです。 説明が乏しく申し訳ありません。 よろしくお願いします。
etherbeg

2021/10/07 01:45

回答を追記しました。
pyamathon

2021/10/08 01:24

ご返信ありがとうございます。 ご連絡が遅くなり申し訳ありません。 ご質問なのですが、 q_num, is_correct = answer csv_data[q_num-1][1] = csv_data[q_num-1][1] + is_correct の部分はどう動作しているのかご教示いただけますと幸いです。 よろしくお願いします。
pyamathon

2021/10/08 08:41

ごめんなさい。先ほどの質問ですが深く考えすぎていまして理解できました。 ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問