🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

配列

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

Q&A

解決済

3回答

754閲覧

別のファイルから値を読み込み書き込む

31___basketball

総合スコア1

Python

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

配列

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

0グッド

0クリップ

投稿2020/11/26 05:42

編集2020/11/26 06:23

前提・実現したいこと

2つのcsvファイルがあり,1つ目は16000行4列の配列で2つ目は1行10列の配列です.まず,この2つのファイルをリストとして読み込みました.この1つ目のファイルの3列目は0が1000個並べられた後5が500個並べられておりそれが16000まで規則的に続いています.この3列目が0の時は列を追加し0を出力,5であれば2つ目のファイルから読み込んでそれを追加した列に出力したいのですが,1回目の5が500個連続に並べられたとき,2つ目のファイルの1行1列目の値を追加し,2回目の5が500個連続に並べられたとき,2つ目ファイルの1行2列目の値を追加し,と5の連続が終わるまで同じことを繰り返し,書き込む数字だけ毎回違う数値にしたいのですがどういう風にプログラムを組めばよろしいのでしょうか.
また,使用しているpythonはpython3.7.9です.

1つ目のcsvファイルをリストとして出力      ・・・ ['0.001', '0', '5', '-10'] ['0', '-0.001', '5', '-10'] ['0', '-0.001', '5', '-10'] ['0', '-0.001', '5', '-10'] ['0', '-0.001', '5', '-10'] ['-0.001', '-0.001', '5', '-10'] ['-0.001', '-0.001', '5', '-10'] ['-0.001', '0', '5', '-10'] ['-0.001', '-0.001', '5', '-10'] ['-0.001', '-0.001', '5', '-10'] ['-0.001', '-0.001', '5', '-10'] ['-0.001', '-0.002', '5', '-10'] ['-0.001', '-0.002', '5', '-10'] ['-0.001', '-0.002', '0', '-10'] ['-0.001', '-0.002', '0', '-10'] ['-0.001', '-0.002', '0', '-10'] ['0', '-0.002', '0', '-10'] ['0', '-0.002', '0', '-10'] ['0', '-0.002', '0', '-10'] ['0.001', '-0.002', '0', '-10'] ['0.001', '-0.002', '0', '-10'] ['0', '-0.002', '0', '-10'] ['0', '-0.001', '0', '-10'] ['0', '0', '0', '-10'] ['0', '0.001', '0', '-10'] ['0', '0.002', '0', '-10'] ['0', '0.003', '0', '-10'] ['0', '0.003', '0', '-10']      ・・・ 2つ目のcsvファイルをリストとして出力 ['7.000000000', '8.000000000', '1.000000000', '1.000000000', '4.000000000', '5.000000000', '9.000000000', '5.000000000', '1.000000000', '3.000000000']

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

エラーメッセージ

該当のソースコード

import glob glob.glob("/data/*") glob.glob("/data/*20201124 脳波/*") glob.glob("/data/*20201124 数字配列/*") import csv import numpy as np with open('/data\20201124 数字配列\OpenBCI_2020_11_25_16_06_55.csv', 'r') as csvfile: count_file = csv.reader(csvfile) for row1 in count_file: print(row1) with open('/data\20201124 脳波\OpenBCI_2020_11_25_16_06_55.csv', 'r') as csvfile: eeg_file = csv.reader(csvfile) for row2 in eeg_file: if "0" in row2[2]: row2.append("0") else: row2.append(row1) print(row2)

試したこと

上記のプログラムを組んで実行したのですが,このように3列目が5の時2つ目のファイルをすべて書き込んでしまい上手にいきませんでした.(1部抜粋)

['-0.004', '0.001', '5', '-10', ['7.000000000', '8.000000000', '1.000000000', '1.000000000', '4.000000000', '5.000000000', '9.000000000', '5.000000000', '1.000000000', '3.000000000']]

また,3列目が0の時は0を書き込むというプログラムは上手にできました.

また,出力した結果としては,     ・・・ ['0.001', '0', '5', '-10','7'] ['0', '-0.001', '5', '-10','7'] ['0', '-0.001', '5', '-10','7']    一回目の5の塊 ['0', '-0.001', '5', '-10','7'] ['0', '-0.001', '5', '-10','7'] ・・・ ['-0.001', '-0.001', '5', '-10','8'] ['-0.001', '-0.002', '5', '-10','8'] ['-0.001', '-0.002', '5', '-10','8']  二回目の5の塊 ['-0.001', '-0.002', '5', '-10','8'] ['-0.001', '-0.002', '5', '-10','8'] ['-0.001', '-0.002', '5', '-10','8']    ...    ・・・

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

ayousanz

2020/11/26 05:52 編集

ソースコードはハイライトにするために,コードの書き方に沿って記載してください また使用しているpython,その他の開発環境等も記載したほうがいいかと思われます.
31___basketball

2020/11/26 06:05

ご指摘ありがとうございます.初めてこの質問を使用したので使い方が理解していなくて,読みづらくて申し訳ございません.また,何かあったらご指摘よろしくお願い致します.
TakaiY

2020/11/26 06:12

1つめのファイル、2つめのファイルはほんとうにファイルの中身ですか? これでは、CSVファイルではありませんよね?pythonで配列に読み込んだ後にprintで出力した内容ではありませんか?
31___basketball

2020/11/26 06:14

申し訳ございません.その通りです.csvファイルを一度読み込んでそれをprintで出力したものとなります.ご指摘ありがとうございます.
guest

回答3

0

ベストアンサー

row2.append(row1) で追加するのは、row1そのものではなく、row1のn番目の数字で、それは上から何番目の5の塊かによって変わるわけですよね?

であれば、「今何番目の5の塊にいるか」によって、追加する値を決定して、
「0の塊から5の塊に変ったタイミング」で値を増やします。

これが正しければ、最後のループのあたりをこのようにすれば、よいのではないかと思います。

python

1number_index = 0 # 今何番目の5の塊にいるか 2process_5 = False # 5の塊を処理中か 3 4with open('/data\20201124 脳波\OpenBCI_2020_11_25_16_06_55.csv', 'r') as csvfile: 5 eeg_file = csv.reader(csvfile) 6 for row2 in eeg_file: 7 if "0" in row2[2]: 8 process_5 = False 9 row2.append("0") 10 else: 11 if not process_5: 12 number_index += 1 13 process_5 = True 14 row2.append(row1[number_index]) 15 print(row2) 16

自分で考えてみたほうがいいと思いますが、row2の最初が使われない件を修正してみました。

python

1number_index = 0 # 今何番目の5の塊にいるか 2process_5 = False # 5の塊を処理中か 3 4with open('/data\20201124 脳波\OpenBCI_2020_11_25_16_06_55.csv', 'r') as csvfile: 5 eeg_file = csv.reader(csvfile) 6 for row2 in eeg_file: 7 if "0" in row2[2]: 8 if process_5: 9 process_5 = False 10 number_index += 1 11 row2.append("0") 12 else: 13 process_5 = True 14 row2.append(row1[number_index]) 15 print(row2) 16

インデックスのインクリメントのタイミングを、5の塊を抜けたところ=0の塊に入ったところに変更です。

投稿2020/11/26 12:53

編集2020/11/27 02:21
TakaiY

総合スコア13765

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

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

TakaiY

2020/11/26 13:02

この処理だと、row2の最初の値が使われなくなってしまうかも。
31___basketball

2020/11/27 01:48

回答してくださりありがとうございます.これをもとに少し変えてみて実行してみたらエラーでてきましたが自分の思い通りの出力結果に近づいてきました.試行錯誤してもできなかったらまた質問に書きたいと思います.ありがとうございました.
31___basketball

2020/11/27 02:00

実行結果をよく見たらやはりrow1の一番最初の値が入っていなく,エラー結果でrangeが合っていないと出てしまいました.もう少し考えてみます.
TakaiY

2020/11/27 02:23

方針は合っていそうなので、余計なお世話かもしれませんが、修正版を作ってみました。
31___basketball

2020/11/27 02:28

私もさっき考えていたのですが,pythonが初心者なもので一番最初で定義したnumber_index=0をnumber_index=-1にしたらうまくいきました.でもこの考えだとちょっと安易的な考えになってその場しのぎになってしまうのかなと悩んでいました.修正版まで考えていただいて,本当に申し訳ないです.助かりました.ありがとうございます.
TakaiY

2020/11/27 02:37

なぜその値にしてあるのかということが明確であれば、-1にするのも悪くないやりかただと思いますよ。 初期値をどんな値にすべきかというのは意外と難しい問題で、今回であれば、5が先に来る場合があるのであれば値が変ったり、両方に対応したければまた処理を変えなくてはならないかもしれないなど。
31___basketball

2020/11/27 03:18

ありがとうございます.このプログラミングを通じて自分の力が少し上がったような気がします.今度プログラムをする機会があれば人に頼らず1からすべて作り上げたいと思います.ありがとうございました.
guest

0

extendメソッドを使えば期待通りになるのではと思います。

python

1 if "0" in row2[2]: 2 row2.append("0") 3 else: 4 row2.extend(row1)

投稿2020/11/26 06:10

plasticgrammer

総合スコア629

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

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

31___basketball

2020/11/26 06:22

ご回答ありがとうございます.試してみたのですが,試したことの欄に書かれている通りの出力になってしまいました.ですが,ご回答のほう本当にありがとうございます.参考にしてみます.
guest

0

自分なりに考えたプログラムを載せます.

i = 0 j = 0 with open('/data\20201124 脳波\OpenBCI_2020_11_27_10_42_34.csv', 'r') as csvfile: eeg_file = csv.reader(csvfile) for row2 in eeg_file: if "0.000" in row2[2]: if j != 0: j = 0 i += 1 row2.append("0.000") else: row2.append(row1[i]) j += 1 print(row2)

これでも上手に出力することができました.
回答してくださった方々本当に助かりました.
ありがとうございます.

投稿2020/11/27 03:27

31___basketball

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問