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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Python

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

解決済

解凍先の複数のディレクトリにある特定の名前のtsvファイルで、指定列の条件を満たす数値の数の全ファイルの合計を出したい。

maltines
maltines

総合スコア4

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Python

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

1回答

-1評価

0クリップ

239閲覧

投稿2022/07/28 09:56

編集2022/07/29 17:49

前提

pythonで、ファイルを解凍し、ある特定の名前のtsvファイル(複数ある)の指定列において、条件を満たす数値の数を計算し、それを全てのファイルで合計したい。

実現したいこと

pythonで、

あるディレクトリ内にある複数のtar.gzファイルを全て解凍する

解凍した各tarファイルをそれぞれ元の名前が付けられたディレクトリにいれる

各tarファイルから解凍されたファイルがあるディレクトリから、ある特定の名前のtsvファイルを取り出す

取り出した各ファイルの、指定列の数値を参照する

その列の数値の内、条件を満たす数値の数を数える。

各ファイルで計算したその数値を全て足し合わせる。

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

※ 現在の問題
現在、ループする各ファイルで、指定列の条件を満たす数値が全ファイル分出ています。
最後に、各ファイルで計算されたこの数値を全て足し合わせたものを表示したいのですが、方法が分かりません。

以下、過去のエラーです。既に解決しました。
まず、コードを実行してもvscodeの出力欄に合計数が出力されません。
初心者ですので、コードが間違っているか、vscodeの環境設定が間違っているかわかりません。稚拙な質問で申し訳ございません... *解決済み

※melianさんの助言に基づいたコードの変更後 *解決済み
修正後のエラーメッセージ(このメッセージの前にtsvファイルの内容らしきものがターミナルにあった。)

Traceback (most recent call last): File "c:\case study\apply date check.py", line 16, in <module> aymd = (20210401<= df['app_year_month_day'] <=20210430).sum() File "C:\Py\python39\lib\site-packages\pandas\core\generic.py", line 1527, in __nonzero__ raise ValueError( ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

※ TakaiY さんの一度目の助言に基づいたコードの変更後 *解決済み

FileNotFoundError: [Errno 2] No such file or directory: 'JPWRP_20220413.tar.gz'

このディレクトリ名は後半のfor文の2番目です。エクスプローラーで確認したところ、この名前のフォルダがあったので、なぜこのディレクトリが見つからないと出ているのか分かりません。

※ TakaiY さんの二度目の助言に基づいたコードの変更後 *解決済み
現在、ループする各ファイルで、全ての列で条件を満たす値の数がが出てしまいます。
(1列目=5, 2列目=8,3列目=43,... のような感じで)

これを、指定列(app_year_month_dayの列)のみ表示し、最後に、この各ファイルで計算されたこの指定列の数値を全て足し合わせたものを表示したいのですが、方法が分かりません。

該当のソースコード

python

import os import tarfile import glob import csv os.chdir(r"C:\case study\applying date check") #解凍元があるディレクトリ tar_gz_files = glob.glob('*.tar.gz') #拡張子が.tar.gzのファイルを全て捕捉 for file in tar_gz_files: #上記ファイル全てで以下の作業を行なう os.chdir(r"C:\case study\applying date check") #解凍元があるディレクトリに戻る with tarfile.open(file) as tar: #ファイルを解凍 tar.extractall('C:\\case study\\after defrost\\'+ file) #解凍元ファイルと同じ名前のディレクトリを作成し解凍先に指定 os.chdir(r"C:\case study\after defrost\\" +file +'\\JPWRP') #解凍された中に何故かJPWRPというディレクトリが出来ているため、その中へパスを変更 import pandas as pd df= pd.read_csv('upd_mgt_info_p.tsv',delimiter='\t') #目的の名前がついているファイルを読み込む print(df) #読み込んだファイルを表示 print(df.columns) #ここがあまり分かっていないが、各列のヘッダーを表示? aymd = ((df['app_year_month_day'] >= 20210401) & (df['app_year_month_day'] <=20210430)).sum() #任意の列において、ある範囲にある数値が何個あるか数える。 print('num_data='+str(aymd)) #その指定列に条件を満たす値がいくつあったか表示 #最後に各ファイルで計算した値を全て足し合わせ、表示したい

試したこと※現在

前半部分のみ試してみると上手く解凍ファイルが各ディレクトリに収まってました。

後半部分を実行すると、ループする各ファイルで、指定列の条件を満たす数値が全ファイル分出ています。

最後に、この各ファイルで計算されたこの指定列の数値を全て足し合わせたものを表示したいのですが、方法が分かりません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

melian

2022/07/28 10:06

tar.extractall('C:\\case study\\after defrost\\'+ file) としているので、C:\\case study\\after defrost\\ には TSV ファイルがないはずです。そこには元の 〜.tar.gz という名前の複数のディレクトリがあって、それぞれのディレクトリ名を付けてアクセスする必要があります。
maltines

2022/07/28 10:23

ご助言誠にありがとうございます。変更後エラーが出たので更新させて頂きました。
melian

2022/07/29 03:12

aymd = df[(df['app_year_month_day'] >= 20210401) & ( df['app_year_month_day'] <=20210430)].sum() は、 aymd = ((df['app_year_month_day'] >= 20210401) & (df['app_year_month_day'] <=20210430)).sum() ではないでしょうか。
maltines

2022/07/29 03:22

ご助言誠にありがとうございます。最後の部分の足し合わせる部分が上手くいかず、解決策が分からなかったため、更新させていただきました。
melian

2022/07/29 03:40

例えば sum_aymd という変数を定義しておいて、ループ内で aymd の値を加算していくとよいかと思います。 sum_aymd = 0 for file in tar_gz_files:   :   aymd = ...   sum_aymd += aymd print(sum_aymd)

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Python

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