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

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

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

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

Python

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

Q&A

解決済

5回答

1294閲覧

Pythonでcsvの特定列をテキストに書き出し

under

総合スコア12

Python 3.x

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

Python

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

1グッド

0クリップ

投稿2019/01/05 10:10

編集2019/01/06 07:29

先ほど質問させて頂いて、また不明点が出てきてしまったのでご質問です…。
下記のようなcsvデータがあるとします。
[[aaaa,bbbb]
[cccc,dddd]
...
[wwww,xxxx]
[yyyy,zzzz]]
このデータの第2列のみをテキストとして保存したいと考えています。
省略部分にも、同じように[eeee,ffff]と続いていきます。

理想としましてはテキストファイルに
bbbb
dddd
...(ここも省略されずに)
xxxx
zzzz
といった形で保存出来る様にしたいです。

python

1val = pd.read_csv('test3.csv', usecols=[1]).values

上記ソースで、
[[bbbb]
[dddd]
...
[xxxx]
[zzzz]]
とまでは出力出来る様になりました。
これを省略されずに、且つテキストに保存する方法はありますでしょうか?
ご存知でしたらご教授お願い致します。

現在走らせているソースはこちらになります(修正しました)

python

1import numpy as np 2import csv 3 4x = open("test.txt", "r") 5y = open("test.txt", "r") 6z = open("test1.txt", "w")#ここを任意の名前に 7 8gyou = sum(1 for i in x) 9last = gyou-2 10 11data=[] 12for i in range(22): 13 y.readline() 14for i in range(last): 15 lines1 = y.readline() 16 data.append(lines1) 17 18print(data) 19 20z.writelines(data) 21 22x.close() 23y.close() 24z.close() 25 26bad_words = ['Channels', 'Samples', 'Date', 'Time', 'Y_Unit_Label', 27 'X_Dimension', 'X0', 'Delta_X', '***End_of_Header***', 'X_Value'] 28 29with open("test1.txt", "r") as oldfile, \ 30 open("test.csv", "w") as newfile: 31 32 for line in oldfile: 33 if any(bad_word in line for bad_word in bad_words): 34 continue 35 36 line = line.replace('\t', ',') 37 line = line.lstrip() 38 newfile.write(line) 39 40with open('test.csv','r') as csv_file: 41 reader = csv.reader(csv_file) 42 with open('data.txt', 'w', newline='') as f: 43 for row in reader: 44 f.write(row[1] + '\n') 45 46
oasis701👍を押しています

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

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

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

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

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

guest

回答5

0

ベストアンサー

貴殿の全コードをコピペして走らせました。
実行環境は、win10です。

問題なく、下記の通りのデータが作成されます。
0.135892
0.450818
0.532731
0.364370
0.370977
0.379528
0.271333
0.251147
0.231475
0.162362
0.082534
-0.022594
-0.120910
.....
今度は、エラー出ませんでした。不思議です。
さらに、test2.txtをそのまま、使用されているので、「#テキストからcsvの作成」より前のデータは関係ないと思います。

test.txtとしても、問題なく2列目が改行されて一列に出力されます。貴殿のコードは正しいです。

他に、テキストファイルの場合、考えられる改行されない要因として、改行コードに問題があるのではないかと思います。LFの可能性?

以下の様にしてみて下さい。

python

1with open('test1.csv','r') as csv_file: 2 reader = csv.reader(csv_file) 3 with open('data.txt', 'w',encoding='utf-8', newline=None) as f: '''←newline=Noneとする。''' 4 for row in reader: 5 f.write(row[1] + '\n') 6 continue

それでも、だめなら、
基本に戻って、\nなのか、\rなのか確かめる必要があります。

python

1x = 'Python文字列\n改行' 2print(x)

Python文字列
改行

と出れば、テキストの改行は問題ない事になります。

投稿2019/01/06 09:37

hit701

総合スコア148

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

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

under

2019/01/06 09:48

ありがとうございます!! 以下の様にしてみて下さい~のコードに置き換えたら、要素ごとに改行され1列のデータとして出力されました! 改行がLFだった可能性が考えられますね…。 長々とお付き合い頂きまして本当に感謝致します。 一方的な要望にお応えしてくださって本当にありがとうございました。
hit701

2019/01/06 09:56

いえいえ、ここは、お助け合いの場ですので、お互い様ということで。 私も、貴殿のコードを見させて頂き、ありがとうございました。勉強になります。 今回は、日曜日で、たまたま、時間があっただけです。 pandasや、numpyなど、私は、分からないことだらけです。 特に、bs4を駆使したいのです。
under

2019/01/06 10:03

こちらこそ本当にお世話になりました。 実のところ、私もpandasやnumpyについてはまだまだ分からないところばかりです。 bs4についても、スクレイピングに使うなら便利なんだなぁくらいのふんわりした状態なので、まだまだ勉強が必要ですね…。 普段、なかなかtxtからcsvに変換するという機会はあっても、逆はあまり…の上に、csvから特定列のみを抜き出してテキスト出力ことはなかったので、非常に助かりました。 重ねて、本当にありがとうございました。
guest

0

hit701様へ。
コード全文になります。
ご確認ください。

python

1import numpy as np 2import csv 3 4x = open("test.txt", "r") 5y = open("test.txt", "r") 6z = open("test2.txt", "w") 7 8gyou = sum(1 for i in x) 9last = gyou-2 10 11data=[] 12for i in range(22): 13 y.readline() 14for i in range(last): 15 lines1 = y.readline() 16 data.append(lines1) 17 18print(data) 19 20z.writelines(data) 21 22x.close() 23y.close() 24z.close() 25 26bad_words = ['Channels', 'Samples', 'Date', 'Time', 'Y_Unit_Label', 27 'X_Dimension', 'X0', 'Delta_X', '***End_of_Header***', 'X_Value'] 28 29#テキストからcsvの作成 30with open("test2.txt", "r") as oldfile: 31 with open("test1.csv", "w", newline='') as newfile: 32 for line in oldfile: 33 if any(bad_word in line 34 for bad_word in bad_words): 35 continue 36 line = line.replace('\t', ',') 37 line = line.lstrip() 38 newfile.write(line) 39 40with open('test1.csv','r',) as csv_file: 41 reader = csv.reader(csv_file) 42 with open('data.txt', 'w', newline='') as f: 43 for row in reader: 44 f.write(row[1] + '\n') 45 continue 46

現状、上記のコードでエラーは出ませんが出力される要素は全て連結されて出てきます。
拙いものではありますが、どうか宜しくお願いします。

投稿2019/01/06 07:47

under

総合スコア12

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

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

0

一応作成しました。

python

1テキストからcsvの作成 2with open("test2.txt", "r") as oldfile: 3 with open("test1.csv", "w", newline='') as newfile: 4 for line in oldfile: 5 #if any(bad_word in line 6 # for bad_word in bad_words):←意味不明なので外しました。 7 # continue 8 line = line.replace('\t', ',') 9 #line = line.lstrip() ←不要なので外しました。 10 newfile.write(line) 11 12以下が、name.csvとして、2列目のデータのみを抽出したファイルです。 13with open('test1.csv','r',) as csv_file: 14 reader = csv.reader(csv_file) 15 with open('name,txt', 'w', newline='') as f: 16 for row in reader: 17 if reader.line_num > 22: ←22行目以下は、データではないし、エラーの元となるので外しました。 18 f.write(row[1] + '\n') 19 continue 20

データを下記の通り、取得しました。
0.135892
0.450818
0.532731
0.364370
0.370977
0.379528
0.271333
0.251147
0.231475
0.162362
0.082534
-0.022594
-0.120910
-0.220226
-0.330422
-0.399736
-0.425595
-0.442785
-0.424076
-0.388062
-0.373064
-0.311939
-0.213879
-0.147279
-0.081883
-0.034613
-0.040310
.......
データは大丈夫だとは思いますが。。。

ただし、原因が不明ですが、
line 41, in <module>
f.write(row[1] + '\n')
IndexError: list index out of range
と出てしまいます。

海外のサイトでも説明がありましたが、色々ある様です。
解決策が見つかりましたら、ご連絡下さい。

ここまで、お確かめ下さい。

投稿2019/01/06 05:35

hit701

総合スコア148

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

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

under

2019/01/06 07:23 編集

ありがとうございます。 不要、意味不明と書かれたソースコードに関しては、そもそものデータの中に不要な文章が入っており、それらを除去するためのものです。 if any(bad_word in line ~ の文に関してはbad_wordsがある行そのものの削除、 line = line.lstrip() の文に関しては、約500データごとに謎の行間があるためこれらを使用して数字のみのデータとなるようにしています。 私のほうで走らせてみた結果、エラーは出ませんでしたがやはり連結した状態で出力されてしまいますね…。 上記の私が除去したいと思って書いたソースが悪さしてるのでしょうか…? 追記 ソースコードの上のほうで data=[] for i in range(22): と書いており、こちらで最初の22行目まではスキップを行ってテキストに保存しています。 if reader.line_num > 22: ←22行目以下は、データではないし、エラーの元となるので外しました。 なので上記の文を行ってしまうと、23行目から数えて22行つまりは元データから44行スキップした状態でデータが始まると考えられたので、私のほうで一旦消しております。 問題ありましたらご指摘お願い致します。
under

2019/01/06 07:35

もしhit701様が宜しければ、実際に使用したソースコード全文をお見せいただけますでしょうか…? 私が受け取り方を間違っており、実は走らせているコードが違う、ということがありそうなので… 可能であれば、宜しくお願い致します。
hit701

2019/01/06 07:40 編集

そうですね。 under様の方で、守秘義務等、発生しないのであれば、新たに、回答欄を設けて、コードを全文見せて下さい。 それと、どの環境で実行されているのかも追記願います。私は、WIN, Mac両方対応可能です。
under

2019/01/06 07:48

新規で回答を作成して、ソースコードを載せておきました。 実行環境はWin10になります。 宜しくお願い致します。
guest

0

少し教えて下さい

python

1with open("test1.txt", "r") as oldfile, \ 2 open("test1.csv", "w") as newfile: 3 4 for line in oldfile: 5 if any(bad_word in line for bad_word in bad_words): 6 continue 7 8 line = line.replace('\t', ',') 9 line = line.lstrip() 10 newfile.write(line)

このtest1.txtに、
aaa,bbb
ccc,ddd
が入っているのですか?

元々の前提は、下記の通りです

下記のようなcsvデータがあるとします。 [[aaaa,bbbb]下記のようなcsvデータがあるとします。 [[aaaa,bbbb] [cccc,dddd] ... [cccc,dddd] ...

ひょっとして、[[や、]が含まれているのですか?
単純に、
aaa,bbb
ccc,ddd
ではないのですか?
よろしくお願いします。

投稿2019/01/06 03:12

hit701

総合スコア148

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

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

0

Pandasでは、細かな文字操作がやり難いので、csvで記述して見ました。

python

1import csv 2 3'''ここで、csvファイルを作成''' 4with open('name.csv','w', newline='') as csv_file: 5 writer = csv.writer(csv_file) 6 writer.writerow(['aaa','bbb']) 7 writer.writerow(['ccc','ddd']) 8 9'''上記で出来た、csvファイルを読んで、txtに書き込みました。''' 10with open('name.csv','r') as csv_file: 11 reader = csv.reader(csv_file) 12 with open('name,txt', 'w', newline='') as f: 13 for row in reader: 14 f.write(row[1] + '\n') 15

これで、よろしかったでしょうか?
pandasで、特定の文字を抽出可能なら、pandasでも可能性はあると思っております。

投稿2019/01/05 14:46

hit701

総合スコア148

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

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

under

2019/01/06 00:49

ご回答ありがとうございます。 今すぐに出来る環境にはいないので、本日中に実行して試してみますね…。 結果が出次第、またこちらにコメントさせていただきます。
under

2019/01/06 02:40

こちらのほうでRUNしてみた結果、bbbddd...という要素が全て連結した形で出力がされました。 (0列目は出力されていないが、1列目の要素が全て連結されている、要素同士の間に半角スペースや,はありません。) csvファイルを作成するところからtxtに書き込むまでのソースコードを追記しておきます。
hit701

2019/01/06 02:48 編集

こんにちは おかしいですね。私の実行環境では成功しています。 bbbddd とならなないように、 f.write(row[1] + '\n') と、改行コード '\n'を入れています。 bbb ddd これを外すと bbbddd となります。 もう一度、ご確認下さい。
under

2019/01/06 03:07

こんにちは。 ご回答で頂きましたソースコードをそのまま走らせてみましたが、bbbdddとなりますね…。 with open('name,txt', 'w', newline='') as f: こちらのコード中、name,txtとなっていたのでname.txtと修正して走らせていますが変わらない状態です。 pcの状態が関係している…?のかはわかりませんが、一旦再起動かけてみます。 お手数おかけして申し訳ありません…。
hit701

2019/01/06 03:12

再度、回答欄に質問しました。 ご確認願います。
under

2019/01/06 03:19

ご質問ありがとうございます。 仰る通りでもともとのデータ自体が [[aaaa,bbbb] [cccc,dddd] ... [wwww,xxxx] [yyyy,zzzz]] という形で、データ最初と最後にそれぞれ[と]がついた状態です。
under

2019/01/06 03:28

現在使用しているソースコードを修正しました。 必要であれば使用している元データに関しても記載致します。 分かりにくいご質問ですみません…。
under

2019/01/06 04:01

dropboxに実際に使用しているデータをあげておきました。 こちらが元のデータで、私が質問であげたソースコードの中のtest.txtにあたります。 https://www.dropbox.com/s/byq4f4liau3r1il/test.txt?dl=0 確認の必要がありましたらご確認ください。
hit701

2019/01/06 04:10

なるほど ここでは、コードを書きにくいので「少し教えて下さい」に移します。
under

2019/01/06 04:18

了解致しました。 お待ちしております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問