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

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

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

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

Python

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

Q&A

解決済

2回答

2696閲覧

midi ファイルを csv に変換したい

Piani

総合スコア8

CSV

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

Python

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

0グッド

0クリップ

投稿2020/05/08 10:53

編集2020/05/08 12:16

読み込んだMIDIファイルをコンソール上で表示できるようにし,そのスクリプトに追記する形でcsvファイルを出力したいと思い,画像のようなコードを書きましたが,AttributeError: module 'csv' has no attribute 'writerows'
というエラーを受けてしまいました.私は普段pythonを使用しておらず勉強不足で申し訳ございませんが,アドバイスをいただけましたら幸いです.
イメージ説明

[追記 修正後↓]
ご指摘いただいた内容をもとに修正をしました.また,notesの中身は以下の画像のようになっております.イメージ説明
イメージ説明

以上のコードにて
_csv.Error: iterable expected, not Note
というエラーをもらってしまいました.iterableとは反復可能なものという意味だと思いますが,noteに変更しても定義されていないと言われてしまいました.

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

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

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

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

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

guest

回答2

0

ベストアンサー

notes の中身は確認してませんが、writerows の使い方は

python

1# with ステートメントで記述すると、close()は必要に応じて自動的に呼ばれます。 2 3with open("new.csv", "w", newline="") as f: # <- newline="" がないと空行が入ります 4 w = csv.writer(f) 5 w.writerows(notes) 6

文字列に変換可能でないと書き込めないので、
Note オブジェクトをどのように csv へ書き込むのか、
次にデータの変換が必要になると思います。

python

1## (1) ※rowsとrowの違いに注意。一行ずつ書き込み 2for note in notes: 3 w.writerow([note.start, note.end, note.pitch, note.velocity]) 4 5## (2) writerows の場合 6w.writerows((note.start, note.end, note.pitch, note.velocity) for note in notes) 7 8## (3) 何度も note. と書きたくない場合 9from operators import attrgetter 10w.writerows(map(attrgetter("start", "end", "pitch", "velocity"), notes))

追記: 実行確認はしてないのでコピペの際は注意。w.writenow の追加位置確認用です。

python

1with open("new.csv", "w", newline="") as f: 2 w = csv.writer(f) 3 for note in notes: 4 w.writerow([note.start, note.end, note.pitch, note.velocity]) 5 6 # XXX: w.writerows(notes) がエラー原因。理由は先述の通りデータの変換が必要 7 8# with open() ~では、 9# インデントで表現されたブロックの終端でファイルが閉じます。 10# ブロックの終端は、下の for 文でインデントがwith~と同じ位置に戻る箇所。 11 12for note in notes: 13 # ここでの w.writerow は、ファイルが閉じられてるので無効。 14 print(note)

投稿2020/05/08 11:59

編集2020/05/08 12:47
teamikl

総合スコア8664

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

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

Piani

2020/05/08 12:18

大変丁寧にご返答いただきありがとうございます! トリビアルな点かもしれませんが,追加でエラーを頂いてしまったので,概要を上記に追記させて頂きました.
teamikl

2020/05/08 12:30

追加の分は、w.writerows(notes)の代わりにインデントを入れて書いてください。 open withの後のインデントの行が終わると、ファイルは閉じられます。 出来れば、コードは画像ではなくテキストで貼り付けていただけると、 コピー可能になるので、コード全文を提示しやすいです。
Piani

2020/05/08 12:44

ありがとうございます! 正しく動作し,csvファイルが得られました. また,質問の仕方についてもご教示いただき初心者として大変助かりました.今後そのようにしていこうと思います.
teamikl

2020/05/08 12:56

コードを差分のみで記述してしまった為、インデントの有無を失念してて 齟齬が発生しやすいコードになってしまってました。 ここは、最初から上のコードと繋げて書けばよかったですね。 エラー原因についても説明を追記したのでご確認ください。
guest

0

csv には writerows というアトリビュートはない、といってます。
も一度見直してみては。

#スペルミス?

投稿2020/05/08 10:57

y_waiwai

総合スコア87774

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

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

Piani

2020/05/08 11:17 編集

ありがとうございます. 13行目をw = w.writerows(notes) に修正してみました. コードはまだ正常に動いてはいませんが,当該エラーは出なくなりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問