質問するログイン新規登録

Q&A

解決済

1回答

1073閲覧

テキストファイルから2列のcsvファイルを生成する方法

green2021

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/04/06 09:00

0

0

前提

Pythonにおいて、カンマで区切られたテキストファイルから、2列のcsvファイルを生成しようとしていますが、1列のcsvファイルになってしまいます。

実現したいこと

以下の手順で、2列のcsvファイルを生成したいと思います。
①カンマで区切られたテキストファイルを読み込む。
②余計な文字を取り除き、配列にテキストファイルを加える。
③配列をそのままcsvファイルに変換してしまうと、1文字ずつの挿入になってしまうので、二次元配列に入れる。
④ ③をsklearnのtrain_test_splitで、データを分割(最終的に機械学習用のデータとして使用するため)し、出力。

しかし、出力されたcsvの先頭と末尾にダブルクォーテーションがついているためなのか、1列のcsvになってしまいます。

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

出力されたcsvは以下のようになります。(列が長くなるため、テストデータのみ記載) 1列のcsvファイルになってしまいます。 # cli_test.csv "静岡と言ったらお茶,3" "インフルエンザの予防接種を受けた。,2" "ハワイは日本人が多い,5" "お風呂に入る。,4" "睡眠はきちんととった。,4"

該当のソースコード

python

1# coding: shift_jis 2 3import csv 4import numpy as np 5from sklearn.model_selection import train_test_split 6 7sentences = [] 8 9with open('test_data.txt') as f: 10 sample_txt = f.readlines() 11 12for s in sample_txt: 13 text = s.translate(str.maketrans({"\u3000":"","\n":""})) 14 sentences.append(text) 15 16# 二次元は配列に入れないと、csvファイルに出力するとき、各セルに一文字ずつ出力されてしまう。 17sentences_column = len(sentences) 18new_sentence = np.array(sentences).reshape(sentences_column,1) 19 20# sklearnのtrain_test_splitで、データを分割 21news_train, news_test = train_test_split(new_sentence, shuffle=True) # 訓練用とテスト用に分割 22# 何も指定していない場合は、25%がテストデータ 23news_path = "./test_data/" 24# csvファイルを保存するパス 25 26with open(news_path+"cli_train.csv", "w" ,encoding="utf-8" ,newline='') as f: 27 writer = csv.writer(f) 28 writer.writerows(news_train) 29 # 訓練データを"news_train.csv"に保存 30 31with open(news_path+"cli_test.csv", "w" ,encoding="utf-8",newline='') as f: 32 writer = csv.writer(f) 33 writer.writerows(news_test) 34 # テストデータを"news_test.csv"に保存 35 36#test_data.txt 37カレーを食べた。,1 38インフルエンザの予防接種を受けた。,2 39あなたに渡す。,3 40お風呂に入る。,4 41太郎の靴だ,5 42ビタミン剤を買う,1 43川で泳ぐ,1 44阿蘇山が噴火した。,3 45チョコレートとクッキーだ,5 46人気者の姉,5 47ハワイは日本人が多い,5 48新型の携帯電話を買う,2 49お酒が好きだ。,2 50トムの妹はサリーだ。,2 51静岡と言ったらお茶,3 52飛行機で九州に行く。,3 53睡眠はきちんととった。,4 54数学が得意だ,1 55半角 スペース,1 56全角 スペース,2

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

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

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

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

guest

回答1

0

ベストアンサー

そもそもsentencesが二次元配列になっていないようなので、
text = s.translate(str.maketrans({"\u3000":"","\n":""}))
text = s.translate(str.maketrans({"\u3000":"","\n":""})) .split(",")
としてみてはいかがですか。

あるいは、

python3

1with open('test_data.txt') as f: 2 sample_txt = f.readlines() 3 4for s in sample_txt: 5 text = s.translate(str.maketrans({"\u3000":"","\n":""})) 6 sentences.append(text)

のところを

python3

1with open('test_data.txt') as f: 2 reader = csv.reader(f) 3 sentences = list() 4 for row in reader: 5 row[0] = row[0].replace("\u3000", "") 6 sentences.append(row)

としてしまうか。

投稿2022/04/07 00:33

編集2022/04/07 00:39
jeanbiego

総合スコア3966

green2021

2022/04/07 03:53

返信ありがとうございます。 with open('test_data.txt') as f: reader = csv.reader(f) sentences = list() for row in reader: row[0] = row[0].replace("\u3000", "") sentences.append(row) 上記の、コードを実装してみたら、「ValueError: cannot reshape array of size 40 into shape (20,1)」と 出力されました。 また、 text = s.translate(str.maketrans({"\u3000":"","\n":""})) .split(",") 上記を実装してみても、同様のエラーが出ます。 ご確認よろしくお願い致します。
jeanbiego

2022/04/07 04:00

# 二次元は配列に入れないと、csvファイルに出力するとき、各セルに一文字ずつ出力されてしまう。 sentences_column = len(sentences) new_sentence = np.array(sentences).reshape(sentences_column,1) # sklearnのtrain_test_splitで、データを分割 news_train, news_test = train_test_split(new_sentence, shuffle=True) # 訓練用とテスト用に分割 上記は、20×2の二次元配列を無理やり20×1にしようとしてますね。 下記のようにリストをそのまま入れるだけで良いかと。 news_train, news_test = train_test_split(sentences, shuffle=True) # 訓練用とテスト用に分割
jeanbiego

2022/04/07 04:02

つまりは目的と違う形(1次元)だからこそ動作していたコードになっていました。 途中途中で変数の形が設計通りかどうか、確認した方が良いですよ。
green2021

2022/04/08 00:18

わざわざ、丁寧な返信も頂きありがとうございます。 無事に目的を果たせました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問