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

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

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

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

Python 3.x

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

7153閲覧

python 大量テキストファイルを読込み、ひとつのcsvファイルに生成

hidemomo

総合スコア31

CSV

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

Python 3.x

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2018/11/01 13:55

編集2018/11/01 15:46

解決したいこと

1.大量の日別(1分おき)×3変数のテキストファイルがあり、それを1つの「時系列csvファイル」にしたいです。
下記データ構造は「Tの後より10-10 18:11(10月10日18時11分)を、Dはデータのことです。
2.また、可能なら途中に「空行」があるので空行削除も行いたいです。

日別ファイルのデータ構造(追記)

テキストデータなので1行表記ですが、\n\n(改行)で同列数・列名のdataframeになります。
データの意味は「T月日時分D変数1、変数2、変数3」です。

\n\nT,10,10,18,11,D,280,523,835,\n\nT,10,10,18,12,D,280,516,834,\n\nT・・

目指したいデータ構造

datetime val_1 val_2 val_3
10-01 18:11 700 200 200
10-01 18:12 680 150 180
10-01 18:13 670 130 160
(略)
10-31 23:59 120 80 100

環境

windows10
python:3.6

コード/試行したこと

python

1import pandas as pd 2import csv 3import os, glob 4 5dir = './test_sin' 6text_files = glob.glob(dir + '/*.txt') 7 8for text_f in text_files: 9 file = open(text_f, 'r') #読み込み 10 string = file.read() #全データをと読み込む 11 #w = csv.writer(file, delimiter=',')

(output)text_fは./test_sin\D1029.TXTのみですが、

for

1 print(text_f)```だと全ファイルを読み込んでいます。 2 3 4 5### 他に試したこと 6\n\nで改行されていますのでエクセルでひとつずつ開いてみました。datetimeなのでcsv変換はできます。但し、日々の大量のテキストデータを1つずつ開くのは非現実的です。何とかpythonで処理したいと考えています。 7 8何卒、ご教授のほどよろしくお願いします。

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

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

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

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

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

y_waiwai

2018/11/01 14:01

日別のテキストファイルとはどういう内容のファイルなんですか?できれば具体例を示すようにしてください
hidemomo

2018/11/01 15:47

ご質問ありがとうございます。日別ファイルのデータ構造(追記)に記載しておきましたが、意図に合っていますか?
guest

回答2

0

ベストアンサー

とりあえず、考えなければならないことは

1 テキストデータをDataFrame化する処理
2 複数のDataFrameを1つにマージする処理

の2点。

まずは1のDataFrame化ですが、これは

  • split() をつかって '\n\n' にて分割
  • 前後にある余分な','をstrip()で削除
  • 空の行は削除
  • split() 行毎に ',' で分割
  • 上記の処理で出来た 2重リストをDataFrame化

の処理を行うことで実現できるかと思います。
コードにすると以下のような感じ。

Python

1import pandas as pd 2 3data = "\n\nT,10,10,18,11,D,280,523,835,\n\nT,10,10,18,12,D,280,516,834,\n\nT,10,10,18,13,D,280,523,835" 4 5data = [row.strip(',').split(',') for row in data.split('\n\n') if row] 6df = pd.DataFrame(data, dtype=int) 7print(df) 8# 0 1 2 3 4 5 6 7 8 9#0 T 10 10 18 11 D 280 523 835 10#1 T 10 10 18 12 D 280 516 834 11#2 T 10 10 18 11 D 280 523 835

あとは pandas上で

  • 1列目から4列目までのデータから datetime型のデータを生成して Indexにする
  • 不要な行を削除(0列目から5列目)
  • 一応 6列目から8列目のカラム名を変更

の処理を行うと良いので、

Python

1df.index = pd.to_datetime({'year':2018,'month':df[1], 'day':df[2],'hour':df[3],'minute':df[4]}) 2df = df.drop([0,1,2,3,4,5], axis=1).rename({6:'val1',7:'val2',8:'val3'}, axis=1) 3print(df) 4# val1 val2 val3 5#2018-10-10 18:11:00 280 523 835 6#2018-10-10 18:12:00 280 516 834 7#2018-10-10 18:13:00 280 523 835

となります。

次に 2 の件ですが、これは簡単で、

dfs = []

のような空のリストを準備しておきファイル毎に出来た DataFrame を

dfs.append(df)

とリストに追加していきます。
そして最後に

marged_df = pd.concat(dfs)

とすることで、1つの結合されたDataFrameが出来るかと思いますので
必用に応じて sort_index()などを行った後に to_csv()すると良いのではないでしょうか

投稿2018/11/02 00:27

magichan

総合スコア15898

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

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

hidemomo

2018/11/02 03:44

ご回答ありがとうございます。うまく挙動できました。 リスト内包表記でsplitを使用するまでは思いついたのですが、具体的にsplitする対象が不明でしたので 大変助かりました。 後は、こちらのコードを参考に大量(30日分)のテキストデータをcondatまで持っていけるようアレンジしてみます。 本当にありがとうございました。
guest

0

readの代わりにreadlinesを使って行毎リストに読込んで、文字列長で判定すればできます。
単純なコード例は以下のようになります。

Python

1with open('in.txt', 'r') as fin: 2 lines = fin.readlines() # 行毎に全ファイルをリストに読込。改行文字も含まれる。 3 with open('out.txt','w') as fout: 4 for l in lines: # 行毎に処理 5 if len(l) > 1: # 改行文字含めて2文字以上 6 #if 'T' in l and 'D' in l: # 上よりも多少厳密なチェック。TとDを含むか 7 fout.write(l)

投稿2018/11/01 16:06

編集2018/11/01 16:07
can110

総合スコア38256

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

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

hidemomo

2018/11/02 03:40

ご回答ありがとうございます。 質問後、readlinesを理解し試行してみましたが便利なツールですね。 助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問