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

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

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

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

Q&A

解決済

2回答

468閲覧

csvのテーブルデータをxlsxに出力するときにcsvファイル名も付記したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

2クリップ

投稿2017/09/01 09:57

編集2017/09/01 09:57

ディレクトリとファイルは以下とします。
01 ---ww0000.csv
| ---ww0001.csv
02 ---ww0222.csv
| ---ww0555.csv
test.py
|
test.xlsx

各csvファイルはここでは全部たまたま同じ以下のテーブルと仮定します。
1 1 1
2 2 2
3 3 3
4 4 4

やりたいことはすべてのcsvファイルから1行目と4行目を抽出(行は自由に指定できる)。
それらの先頭にファイル名を付す(できればwwは削除したいです)。
その後、以下のように全てを結合して1つのxlsxに書き出す、です。
ww0000,1,1,1
ww0000,4,4,4
ww0001,1,1,1
ww0001,4,4,4
ww0222,1,1,1
ww0222,4,4,4
ww0555,1,1,1
ww0555,4,4,4

全てのcsvファイルの指定行を結合してエクセルに書き出すことはできましたがファイル名を付けられません。ご助力頂けますと幸いです。

python

1import glob 2import openpyxl 3import pandas as pd 4 5path = 「ディレクトリ0102の階層までのパス」 6allfiles = glob.glob(path + '/*/*.csv') 7frame = pd.DataFrame() 8list_ = [] 9 10n = 0 11a = n + 1 12b = n + 4 13 14for file_ in allfiles: 15 df = pd.read_csv(file_,sep='delimiter',index_col=None,header=None,engine='python') 16 df_row = df.ix[[a,b],:] 17 list_.append(df_row) 18frame = pd.concat(list_) 19frame.to_excel(「test.xlsxへのパス」,header=False,index=False)

欲を言えば、(抽出された行-変数nに入れた値)の差がファイル名とテーブルデータの間(先頭でもお尻でも構いません)に入ると理想的なのですが、、、先ずはファイル名を加えたいです。
宜しくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ディレクトリ01、02内の全csvファイルから1および4行目を抽出し、対応するファイル名を連結してエクセルファイルに書き出す。

import glob
import openpyxl
import pandas as pd

path = 「ディレクトリ01と02の階層までのパス」
allfiles = glob.glob(path + '//.csv')
frame = pd.DataFrame()
list_ = []

n = 0
a = n + 1
b = n + 4

for file_ in allfiles:
df = pd.read_csv(file_,sep='delimiter',index_col=None,header=None,engine='python')
df_row = df.ix[[a,b],:]
new_row = pd.DataFrame([[file_]],index=[a,b]
df2 = pd.concat([new_row,df_row],axis=1)
list_.append(df2)
frame = pd.concat(list_)
frame.to_excel(「test.xlsxへのパス」,header=False,index=False)

投稿2017/09/05 03:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

pythonのファイル操作やワークシートエクスポートをやったことはないのですが、
DataFrameのテーブル操作とglebのファイル操作のコマンドを調べてみると、

python

1 df_row = df.ix[[a,b],:]

の部分でテーブルデータが出ますから、

python

1join_row = pd.DataFrame([[file_]], columns=list('A')) 2new_row = pd.DataFrame([[file_]], columns=list('A')) 3for var in range(0, len(def_row.index)-1): 4 df.append(new_row)

と、ファイル名"file_"の文字列1列のテーブルjoin_rowをdf_rowと同行数作って
後者のテーブルに

python

1join_row.append(df_row)

と前者の列を追加して、このjoin_rowを

python

1 list_.append(join_row)

として保存するようにすれば、ファイル名の列を先頭に入れたワークシートができるでしょう。

投稿2017/09/01 13:56

seastar3

総合スコア2285

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

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

退会済みユーザー

退会済みユーザー

2017/09/05 03:40

先ず、返信が遅くなり申し訳ありません。 回答を頂きありがとうございました。データフレームに対する理解不足を痛感しました。 ご教示頂いた方法を参考とし、異なりはしますが以下で連結できました。 import glob import openpyxl import pandas as pd path = 「ディレクトリ01と02の階層までのパス」 allfiles = glob.glob(path + '/*/*.csv') frame = pd.DataFrame() list_ = [] n = 0 a = n + 1 b = n + 4 for file_ in allfiles: df = pd.read_csv(file_,sep='delimiter',index_col=None,header=None,engine='python') df_row = df.ix[[a,b],:]   new_row = pd.DataFrame([[file_]],index=[a,b]   df2 = pd.concat([new_row,df_row],axis=1) list_.append(df2) frame = pd.concat(list_) frame.to_excel(「test.xlsxへのパス」,header=False,index=False)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問