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

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

詳細はこちら
CSV

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

Python

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

Q&A

解決済

2回答

565閲覧

pythonでのtxtファイルの書き換え

izm2192

総合スコア12

CSV

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

Python

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

0グッド

0クリップ

投稿2020/12/09 06:34

編集2020/12/10 15:01

前提・実現したいこと

Frame #: 1 ID:1 KPHN (866 800 965 850) ID:2 KPHN (796 850 851 904) Frame_time:0.100 Frame #: 2 ID:1 KPHN (866 800 967 851) **ID:3** KPHN (796 852 851 906) Frame_time:0.133 Frame #: 3 ID:1 KPHN (873 799 976 851) ID:3 KPHN (796 852 853 909)

これを

Frame #: 1 ID:1 KPHN (866 800 965 850) ID:2 KPHN (796 850 851 904) Frame_time:0.100 Frame #: 2 ID:1 KPHN (866 800 967 851) **ID:2** KPHN (796 852 851 906) Frame_time:0.133 Frame #: 3 ID:1 KPHN (873 799 976 851) **ID:2** KPHN (796 852 853 909)

ソース(未完成)

f = open('out.csv', 'r', encoding='UTF-8') i= open('inp.txt','w', encoding='UTF-8') a="ID:" for data in f: if a in data: i.write(data) elif a not in data: i.write(data) f.close()

やりたいこと

このような形式で表記されているtxtファイルがあるとして右4つの座標点のでどれかが+ー5の範囲内ならおなじID に書き直すというプログラムを書きたいです

これはYolov4とDeepsortを用いKPHNという物体をトラッキングしているのですが誤認識などでもともとIDが振られているものに対して新たに新しいIDが振られているのでそれを直したいという感じです。

上の場合でいうとID2とID3は同一物体なのに精度の問題でID3と振られています。

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

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

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

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

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

TakaiY

2020/12/09 06:44

いろいろやってみたようですが、そのときのコードを提示いたでければアドバイスできると思いますよ。 あと、変換した結果としてどのような結果、ファイルとか出力とかを得たいのかも明記するといいと思います。 また、提示されているものは、どう見てもCSVファイルではありません。 なので、CSVファイルだと思って処理しようとするとできないと思います。
guest

回答2

0

作るとしたら、こんな感じでしょうかね。

  1. 元ファイルを開く
  2. 出力先ファイルを開く
  3. 空のID辞書を作る
  4. 元ファイルの内容を1行ずつ読み込んで処理
    a 行頭がID:<数> でなければ、そのまま出力
    b 行頭がID:<数> なら()内の4つの数値を取り出し、ID辞書のエントリのすべてについて、4つの数値と比較する。
    1 条件(全て±5以内)に合うものがあれば、ID:<数> の部分を書き換えて出力。
    2 なければ、そのまま出力し、ID辞書に ID:<数>をキーとして4つの数値を格納する。

投稿2020/12/09 11:16

TakaiY

総合スコア13748

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

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

izm2192

2020/12/09 11:46

ありがとうございます!! わからない部分もあるので調べつつ参考にさせていただいてくんでみたいとおもいます!か
izm2192

2020/12/10 07:14

難しいです。。 pythonまだ勉強したてで一応3版まではできたのですがその後の文字列の条件分岐などが理解できずで。 書いている途中のソース書いておきます荷でお力添えお願いしたいです。 f = open('out.txt', 'r', encoding='UTF-8') i= open('inp.txt','w', encoding='UTF-8') a=("ID:") dic = {} for data in f: print(data,file=i) f.close()
TakaiY

2020/12/10 10:27

この質問欄だと、ソースコードの貼り付けに対応してなくて、インデントが反映できないので、質問を修正して貼り付けてみてください。 内容については、確認してコメントしますね。
TakaiY

2020/12/10 10:41

for 文の中でdataに各行が入っていることは、わかっていますよね? 「行頭がxxxなら」という判定ができませんか? そういう判定をするには正規表現を使うのが一般的です。 正規表現はとっつきにくいですが強力ですのでぜひ使ってみてください。
izm2192

2020/12/10 15:03

今質問のとことにソースを追加してみました! 一応IDという文字があるかどうかを書く行に対してやるというのはできました 次は座標点の比較をしたいのですがどのようにすれば座標点だけを比較対象にできるのかがわからなく詰まってしまいました。。 正規表現について調べてみます
TakaiY

2020/12/11 03:07

正規表現の例としては、こんな感じでしょう。 r'ID:(\d+) +KPHN +((\d+) +(\d+) +(\d+) +(\d+))' これを、re.match()に与えます。 ()が5つ付けてありますが、それぞれについて、結果のgroups()関数であとで参照できるようにしてあります。
guest

0

ベストアンサー

ファイルを変数に読み込み、その変数の内容を修正し、それをファイルに書き込む、と言う手順になります
修正は、ファイルに対して、ではなく変数(文字列変数?)に対しての修正となります
それでコードを書いてみてはいかがでしょうか

投稿2020/12/09 08:53

y_waiwai

総合スコア88038

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

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

izm2192

2020/12/09 11:46

やってみますっ ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問