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

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

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

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

Q&A

3回答

1541閲覧

フォルダ内の各csvファイルの最終行のみを新しいcsvに書き出したいです。

matya

総合スコア16

Python 3.x

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

0グッド

0クリップ

投稿2019/05/28 03:05

前提・実現したいこと

フォルダ内の各csvファイルの最終行のみを新しいcsvに書き出したいです。

発生している問題・エラーメッセージ

最終行だけを書き出したいのですが、全ファイルの全行書き出されてしまいます

該当のソースコード

python

1import csv 2import os 3 4path = 'set_01' 5filelist = [] 6 7for f in os.listdir(path): 8 if os.path.isfile(os.path.join(path, f)): 9 filelist.append(f) 10 11temp = [] 12for file in filelist: 13 if "Output" in file: 14 v = [] 15 reader = csv.reader((open(file, "r", encoding="utf_8")), delimiter=',') 16 for row in reader: 17 v.append(row) 18       temp.append(v[-1]) 19 20writer = csv.writer((open("Output_sum.csv","w",newline="")), delimiter=',') 21writer.writerows(temp)

試したこと

agg.append(v[-1])
この部分を(v[0])とすると、1行目が大量に書き出されるのですが、
(v[0])と(v[-1])以外にすると、「IndexError: list index out of range」になりました。

これをしたことで何かわかったわけではないのですが、agg = []に意図したように情報を格納できていないことはわかりました。どうすればいいのでしょうか。

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

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

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

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

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

guest

回答3

0

プログラミングしなくても シェルでファイルの先頭行と最終行を抽出することができます。

bash

1head -1 ファイル名 > work.csv 2tail -1 ファイル名 >> work.csv

python からこの操作を行わせて work.csv を読み込むようにするか、
事前にこの処理を行ってから csvファイルをつくり python でその csv ファイルを読み込むようにしては如何でしょう?

追記
a.py

python3

1import os 2 3os.system("head -1 a.csv > work.csv") 4os.system("tail -1 a.csv >> work.csv")

実行例
イメージ説明

投稿2019/06/01 23:03

編集2019/06/02 02:12
katoy

総合スコア22324

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

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

matya

2019/06/02 00:08

プログラミングしないという手段もあるのですね。ありがとうございます。 初歩的な質問で申し訳ないのですが、教えていただいた方法でやる場合、 head -1 ファイル名 > work.csv tail -1 ファイル名 >> work.csv の前にどのような操作が必要なのでしょうか。 そのcsvを参照するようにするにはどうすればよいのでしょうか。お手数をおかけしますが、よろしくお願い致します。
katoy

2019/06/02 02:13

回答に追記しました。a.csv からwork.csv を生成しています。 python で書いてますが、シェルスクリプトで書いてもよいです。
guest

0

以下temp.append(v[-1])のインデントを直せば動作するかと思います。

Python

1 for row in reader: 2 v.append(row) 3 #temp.append(v[-1]) 4    temp.append(v[-1])

投稿2019/05/28 03:14

can110

総合スコア38262

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

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

matya

2019/05/28 04:20

インデントを直したところ、ちゃんと書き出されました! ありがとうございました!
guest

0

Python

v = []
reader = csv.reader((open(file, "r", encoding="utf_8")), delimiter=',')
for row in reader:
v.append(row)
temp.append(v[-1])

この部分でどのような処理を行っているか、ご自身で理解されていますか。
0. 一行よみだし、リストに追加
0. リスト末尾の要素を取り出す
0. 一行よみだし、リストに追加
0. リスト末尾の要素を取り出す
0. 一行よみだし、リストに追加
0. リスト末尾の要素を取り出す
0. ...

当然、全行書き出されます。
temp.append(v[-1])は、全ての行を読み込んだ後で実行すべきです。

投稿2019/05/28 03:13

LouiS0616

総合スコア35660

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

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

matya

2019/05/28 04:19

早速回答してくださり、ありがとうございます。 そういうことだったのですね。 勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問