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

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

ただいまの
回答率

90.50%

  • Python

    12175questions

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

  • Python 3.x

    10183questions

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

txtファイルを分割したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,774

momochi

score 8

前提・実現したいこと

iris_data.txtの中身を前半4つと最後の1つのファイルに分割したい。
分割後はcsvファイルに出力したいです。
一応、自分で書けたのですが冗長になったような気がしまして、よりきれいに書けるところがあれば教えてください。

【追記】
途中numpyに変えているのは気にしないでください。別に直さなくてもできて、消すのを忘れていただけです。

iris_data.txt
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
5.0,3.4,1.5,0.2,Iris-setosa
4.4,2.9,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
...
...
..
5.0,2.3,3.3,1.0,Iris-versicolor
5.6,2.7,4.2,1.3,Iris-versicolor
5.7,3.0,4.2,1.2,Iris-versicolor
5.7,2.9,4.2,1.3,Iris-versicolor
6.2,2.9,4.3,1.3,Iris-versicolor
5.1,2.5,3.0,1.1,Iris-versicolor
5.7,2.8,4.1,1.3,Iris-versicolor
iris_data_train.csv
5.1,3.5,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,1.3,0.2
4.6,3.1,1.5,0.2
5.0,3.6,1.4,0.2
5.4,3.9,1.7,0.4
4.6,3.4,1.4,0.3
5.0,3.4,1.5,0.2
...
...
..
iris_target_train.csv
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
...
...
..

該当のソースコード

import csv
import numpy as np

f = open('iris_data.txt')
list1=[] 
#list1=['5.1,3.5,1.4,0.2,Iris-setosa\n',...,'5.7,2.8,4.1,1.3,Iris-versicolor']
for row in f:
    list1.append(row)
f.close()
#print(list1)
#print(type(list[0]))
#print(list)
list2=[]
#list2=list1から改行コード除去
for line in list1:
    line1 = line.replace('\n','')
    list2.append(line1)
list3=[data.split(',')for data in list2] 
#list3=[['5.1', '3.5', '1.4', '0.2', 'Iris-setosa'],...,['5.7', '2.8', '4.1', '1.3', 'Iris-versicolor']]
#print (type(list3[0][0]))

list4=[[[a,b,c,d],[e]] for a,b,c,d,e in list3]
data_list,target_list=[data for data,target in list4],[target for data,target in list4]

#print(data_list)
#print(target_list)

numpy1=np.array(data_list)
numpy2=numpy1.astype(np.float64)
print(numpy2)

f = open('iris_data_train.csv', 'w', newline='')
csvWriter = csv.writer(f) 
[csvWriter.writerow(a) for a in data_list]
f.close()

f = open('iris_target_train.csv', 'w', newline='')
csvWriter = csv.writer(f)
[csvWriter.writerow(a) for a in target_list]
f.close()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/05/15 22:55

    要するに、数字部分と文字部分を分ければ良いのですか?

    キャンセル

  • momochi

    2017/05/15 23:05

    その通りです

    キャンセル

回答 3

checkベストアンサー

+2

pandasを使っていいなら。
やりたいことは irisデータセットを特微とラベルに分割したいんですよね?

# -*- coding: utf-8 -*-
import pandas as pd


def main():
    df = pd.read_csv('iris_data.txt', header=None)
    df.to_csv('iris_data_train.csv', header=False, index=False, columns=range(0, 4))
    df.to_csv('iris_target_train.csv', header=False, index=False, columns=range(4, 5))

if __name__ == '__main__':
    main()


■参考情報
pandas.read_csv
pandas.to_csv

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/15 23:36

    pandsは本などで見かけた事があったのですが、そんな便利なことがてきるのですね!
    勉強してみます

    キャンセル

+1

お邪魔します。

読みにくくてあんまり良いプログラムではないですが、参考までに。
for文に渡しているジェネレータ内包表記のネストは分けたほうが良かったかもです。

list1 = []
with open('iris_data.txt') as f:
    list1 = f.readlines()

with open('iris_data_train.csv', 'w') as f1, open('iris_target_train.csv', 'w') as f2:
    for before, after in ((col[:4], col[4]) for col in (line.strip().split(',') for line in list1)):
        f1.write(",".join(before) + "\n")
        f2.write(after + "\n")

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

シェル芸になってしまいますが回答します。結論から言えば以下のコマンドで実現可能です。

cat iris_data.txt|cut -c 1-15 > iris_data_train.csv
cat iris_data.txt|cut -c 17- > iris_target_train.csv

一応解説をしますと、まずcatコマンドでiris_data.txtを出力して、cutコマンドで1〜15文字目を出力しています。さらにそれをリダイレクトでファイルに保存しています。
二行目も同じく、17文字目から最後までを出力しています。

あくまでこれは即席であり文字数にも依存しているので、よければシェル芸を勉強してこれから役立てていってみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/15 23:41

    シェルも便利ですね!
    ありがとうございます

    キャンセル

  • 2017/05/16 23:05

    b

    キャンセル

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

  • Python

    12175questions

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

  • Python 3.x

    10183questions

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