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

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

ただいまの
回答率

88.37%

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,601

under

score 12

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

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

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


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

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

import numpy as np
import csv

x = open("test.txt", "r")
y = open("test.txt", "r")
z = open("test1.txt", "w")#ここを任意の名前に

gyou = sum(1 for i in x)
last = gyou-2

data=[]
for i in range(22):
    y.readline()
for i in range(last):
    lines1 = y.readline()
    data.append(lines1)

print(data)

z.writelines(data)

x.close() 
y.close()
z.close()

bad_words = ['Channels', 'Samples', 'Date', 'Time', 'Y_Unit_Label',
             'X_Dimension', 'X0', 'Delta_X', '***End_of_Header***', 'X_Value'] 

with open("test1.txt", "r") as oldfile, \
        open("test.csv", "w") as newfile:

    for line in oldfile:
        if any(bad_word in line for bad_word in bad_words):
            continue

        line = line.replace('\t', ',')
        line = line.lstrip()
        newfile.write(line)

with open('test.csv','r') as csv_file:
    reader = csv.reader(csv_file)
    with open('data.txt', 'w', newline='') as f:
        for row in reader:
            f.write(row[1] + '\n')
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+1

貴殿の全コードをコピペして走らせました。
実行環境は、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の可能性?

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

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


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

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


Python文字列
改行

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/06 18:48

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

    キャンセル

  • 2019/01/06 18:56

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

    キャンセル

  • 2019/01/06 19:03

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

    キャンセル

0

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

import numpy as np
import csv

x = open("test.txt", "r")
y = open("test.txt", "r")
z = open("test2.txt", "w")

gyou = sum(1 for i in x)
last = gyou-2

data=[]
for i in range(22):
    y.readline()
for i in range(last):
    lines1 = y.readline()
    data.append(lines1)

print(data)

z.writelines(data)

x.close() 
y.close()
z.close()

bad_words = ['Channels', 'Samples', 'Date', 'Time', 'Y_Unit_Label',
             'X_Dimension', 'X0', 'Delta_X', '***End_of_Header***', 'X_Value'] 

#テキストからcsvの作成
with open("test2.txt", "r") as oldfile:
    with open("test1.csv", "w", newline='') as newfile:
        for line in oldfile:
            if any(bad_word in line
                        for bad_word in bad_words):
                     continue
            line = line.replace('\t', ',')
            line = line.lstrip()
            newfile.write(line)

with open('test1.csv','r',) as csv_file:
    reader = csv.reader(csv_file)
    with open('data.txt', 'w', newline='') as f:
        for row in reader:
             f.write(row[1] + '\n')
             continue


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

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

import csv

'''ここで、csvファイルを作成'''
with open('name.csv','w', newline='') as csv_file:
    writer = csv.writer(csv_file)
    writer.writerow(['aaa','bbb'])
    writer.writerow(['ccc','ddd'])

'''上記で出来た、csvファイルを読んで、txtに書き込みました。'''
with open('name.csv','r') as csv_file:
    reader = csv.reader(csv_file)
    with open('name,txt', 'w', newline='') as f:
        for row in reader:
            f.write(row[1] + '\n')


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/06 13:01

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

    キャンセル

  • 2019/01/06 13:10

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

    キャンセル

  • 2019/01/06 13:18

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

    キャンセル

-1

少し教えて下さい

with open("test1.txt", "r") as oldfile, \
        open("test1.csv", "w") as newfile:

    for line in oldfile:
        if any(bad_word in line for bad_word in bad_words):
            continue

        line = line.replace('\t', ',')
        line = line.lstrip()
        newfile.write(line)


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

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

一応作成しました。

テキストからcsvの作成
with open("test2.txt", "r") as oldfile:
    with open("test1.csv", "w", newline='') as newfile:
        for line in oldfile:
            #if any(bad_word in line
                #        for bad_word in bad_words):←意味不明なので外しました。
                #     continue
            line = line.replace('\t', ',')
            #line = line.lstrip() ←不要なので外しました。
            newfile.write(line)

以下が、name.csvとして、2列目のデータのみを抽出したファイルです。
with open('test1.csv','r',) as csv_file:
    reader = csv.reader(csv_file)
    with open('name,txt', 'w', newline='') as f:
        for row in reader:
            if reader.line_num > 22: ←22行目以下は、データではないし、エラーの元となるので外しました。
                f.write(row[1] + '\n')
                continue


データを下記の通り、取得しました。
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 16:05 編集

    ありがとうございます。

    不要、意味不明と書かれたソースコードに関しては、そもそものデータの中に不要な文章が入っており、それらを除去するためのものです。
    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行スキップした状態でデータが始まると考えられたので、私のほうで一旦消しております。
    問題ありましたらご指摘お願い致します。

    キャンセル

  • 2019/01/06 16:35

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

    キャンセル

  • 2019/01/06 16:38 編集

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

    キャンセル

  • 2019/01/06 16:48

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

    キャンセル

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

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る