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

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

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

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

Python

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

Q&A

解決済

1回答

4598閲覧

リストをCSVに出力する際にエラーが発生しました。

erisawa

総合スコア12

CSV

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

Python

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

0グッド

0クリップ

投稿2020/05/14 05:46

#前提・実現したいこと
画像から読み取った値をリストに格納し、そのリストをcsvとして出力したい。csvには画像取り込み時刻、ファイル名、読み取った値の3つをヘッダーの下に出力したい。

#ソースコード

import os import cv2 import numpy as np import math import glob import csv import time result=[] files=glob.glob("boyler0508/*") for fname in files: img=cv2.imread(fname, 1) #img=cv2.imread('c:/temp/0305.jpg', 1) height = img.shape[0] width = img.shape[1] gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) t,b=cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) b=cv2.bitwise_not(b) edges=cv2.Canny(b,50, 100) circles=cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, dp=1.0, minDist=40, param1=60, param2=80, minRadius=200) circles=cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, dp=1.0, minDist=40, param1=30, param2=20, minRadius=80)#param2=20 circles=np.uint16(np.around(circles)) if circles is not None: circles=circles.squeeze(axis=0) for cx, cy, r in circles: cv2.circle(img, (cx, cy), r, (0,255,0),2) cv2.circle(img, (cx,cy), 2, (0,255,0),2) lines=cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=110, minLineLength=90, maxLineGap=10) lineList=[] lines=cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=35, minLineLength=50, maxLineGap=10) lines=np.uint16(np.around(lines)) for line in lines: x1,y1,x2,y2=line[0] lineList.append((x1,y1,x2,y2)) green_line_img=cv2.line(img, (x1,y1),(x2,y2),(0,255,0),1) x0=lineList[0][0] y0=lineList[0][1] x1=lineList[0][2] y1=lineList[0][3] x2=lineList[1][0] y2=lineList[1][1] x3=lineList[1][2] y3=lineList[1][3] dx0=x1-x0 dy0=y1-y0 dx1=x3-x2 dy1=y3-y2 s_bunsi=(y0-y2)*dx1-(x0-x2)*dx1 s_bunbo=dx0*dy1-dy0*dx1 s=s_bunsi/s_bunbo X0=x0+s*(x1-x0) Y0=y0+s*(y1-y0) X=int(X0) Y=int(Y0) cv2.line(img, (cx,cy), (X,Y), (255,0,0),2) a=cx b=cy-r cv2.line(img, (cx,cy),(a,b), (255,0,0),2) A=np.array([cx-cx,cy-cy]) B=np.array([a-cx, cy-b]) C=np.array([X-cx, cy-Y]) veca=B-A vecb=C-A norm_a=np.linalg.norm(veca) norm_b=np.linalg.norm(vecb) dot_ab=np.dot(veca,vecb) cos_theta=dot_ab/(norm_a*norm_b) radians=math.acos(cos_theta) degrees=math.degrees(radians) if X-cx<0: Deg=int(360-degrees) atai=int(Deg/7.2*2) print(str(atai)+"kg") else: Deg=degrees atai=int(Deg/7.2*2) print(str(atai)+"kg") result.append(atai) date_format='%Y/%m/%d%H:%M' file_list=[] time_crt=time.strftime(date_format,time.localtime(os.path.getctime(fname))) file_list.append([fname,time_crt,atai]) with open('boyler_atai','a',newline="")as f: fieldnames=['ファイル名','日付','値'] writer=csv.DictWriter(f,fieldnames=fieldnames) writer.writeheader() for r in file_list: writer.writerows(file_list) cv2.waitKey(0) cv2.destroyAllWindows()

#エラーコード
File "C:\Users\erifu\Anaconda3\lib\csv.py", line 148, in _dict_to_list
wrong_fields = rowdict.keys() - self.fieldnames

AttributeError: 'list' object has no attribute 'keys'

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

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

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

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

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

meg_

2020/05/14 05:49

エラーが発生しているのはどの行ですか?
erisawa

2020/05/14 05:53

line148というのはwith open('boyler_atai','a',newline="")as f: なのでこの部分だと思います。
x98000

2020/05/14 06:30

エラーが出ているのがcsvモジュールなので、writer(csv.DictWriter)まわりでしょう。 ちなみに、このままだと writer.writerows(file_list) の部分で構文エラーになりそうですが確認しましたか?
meg_

2020/05/14 07:07

line 148とは「File "C:\Users\erifu\Anaconda3\lib\csv.py"」の中の行番号のことでは? エラーメッセージには質問者さんが実行したスクリプトのエラー発生元についての記述があるはずですので、そこを含めてもらわないとエラー原因を特定できないかと。(推測はできますが。。)
erisawa

2020/05/14 08:34

dictwriterの使用をやめるとエラーはでななくなりました。ありがとうございました。
guest

回答1

0

ベストアンサー

csv.DictWriterは文字通りdict(辞書)を書き込みますが、以下の通り

python

1file_list.append([fname,time_crt,atai]) 2... 3writer=csv.DictWriter(f,fieldnames=fieldnames) 4... 5writer.writerows(file_list)

file_listは辞書ではなくリストなので、

python

1AttributeError: 'list' object has no attribute 'keys'

と怒られていると思われます。

投稿2020/05/14 06:46

x98000

総合スコア1096

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問