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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

pandas

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

Q&A

解決済

4回答

3227閲覧

Pythonにおいてファイルの拡張子ごとに異なった形式でファイルを読み込む関数

Danrussia

総合スコア44

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2019/06/17 12:14

編集2019/06/17 14:11

前提・実現したいこと

Pythonにおいて、ファイルの形式(拡張子)をif文で判別して、読み込み方を変える関数を作成しています。(文法的には正しくても、意図した通りに動くかは別として)関数は作成できたのですが、
実際に関数を呼び出してファイルを読み込む段階で上手く動きません。

該当のデータコード① ファイルの拡張子と指定した拡張子の演算記号が==(2019/06/17 22:00以降)

Python3

1import pandas as pd 2import os.path 3def identification_filetype (df1): 4 path, ext =os.path.splitext(df1) 5if ext==".csv": 6 pd.read_csv(df1, encoding="shift-jis") 7elif ext==".txt": 8 pd.read_table(df1, encoding="shift-jis") 9

該当のデータコード② ファイルの拡張子と指定した拡張子の演算記号がis(2019/06/17 22:00以降)

Python3

1def identification_filetype (df1): 2 path, ext =os.path.splitext(df1) 3if ext is".csv": 4 pd.read_csv(df1, encoding="shift-jis") 5elif ext is".txt": 6 pd.read_table(df1, encoding="shift-jis") 7 8os.chdir("C://Users//For Programming//Documents//Python Scripts3") 9df1 = pd.read_csv("AAA.csv") 10 11identification_filetype(df1)

発生している問題・エラーメッセージ(2019/06/17 22:00以降)

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-31-7e076d001f76> in <module>() ----> 1 identification_filetype(df1) <ipython-input-29-c1e0414762b5> in identification_filetype(df1) 1 def identification_filetype (df1): ----> 2 path, ext =os.path.splitext(df1) 3 if ext is".csv": 4 pd.read_csv(df1, encoding="shift-jis") 5 elif ext is".txt": ~\Anaconda3\lib\ntpath.py in splitext(p) 200 201 def splitext(p): --> 202 p = os.fspath(p) 203 if isinstance(p, bytes): 204 return genericpath._splitext(p, b'\', b'/', b'.') TypeError: expected str, bytes or os.PathLike object, not DataFrame

想定しているデータフレーム

イメージ説明
イメージ説明

tiitoiさんにご教授して頂いたコードを動かした時の結果

イメージ説明

解決したい事

関数(これ自体がしっかりと動くものかは別として)からはエラーコードが吐き出されない
のですが、関数を使ってファイルを読み込む時に上記の様なエラーコードが発生しました。

「path, ext =os.path.splitext(df1)」に対して、
「xpected str, bytes or os.PathLike object, not DataFrame」

というエラーコードが出ているのを見るとos.pathで読み込んでいるものがファイルではなく
DataFrameになってしまっている感じがするので、ファイル形式で読みめれば(多分)
解決できるのではと思うのですが、方法が分からないです。

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

Anaconda
Python
Pycharm
お忙しいとは思いますが、よろしくお願いいたします。
情報に不足がありましたら、ご指摘お願いいたします。
ここにより詳細な情報を記載してください。

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

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

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

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

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

tiitoi

2019/06/17 13:35

"AAA.csv" というのが、identification_filetype() に渡して、読み込みたい CSV ファイルでしょうか?
tiitoi

2019/06/17 13:58

DataFrame を呼び出し側で渡してしまっているのが原因です。 回答のように修正してください。
guest

回答4

0

後半のインデントがおかしいです。

投稿2019/06/17 12:26

otn

総合スコア84423

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

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

Danrussia

2019/06/17 13:27

ご指摘ありがとうございます。 何が原因でエラーコードが出なくなったのかが分からないのですが、現在の起きている問題について記述しなおしたので一読して頂ければ幸いです。
guest

0

ベストアンサー

エラーコードが出ているのを見るとos.pathで読み込んでいるものがファイルではなく

DataFrameになってしまっている感じがするので、ファイル形式で読みめれば(多分)

推察されてる通り、read_csv("AAA.csv") で読み込んだ DataFrame を identification_filetype() に渡しているので、関数が受け取った引数がパスを表す文字列ではなくなっているのが原因です。

identification_filetype() が指定したパスからファイルを読み込む関数を推定しているのであれば、以下のようにファイルパスを渡すようにして、関数内では読み込んだ DataFrame を return するべきではないでしょうか?

python

1import os 2 3import pandas as pd 4 5 6def identification_filetype(path): 7 _, ext = os.path.splitext(path) 8 if ext == ".csv": 9 return pd.read_csv(path, encoding="shift-jis") 10 elif ext == ".txt": 11 return pd.read_table(path, encoding="shift-jis") 12 13 14os.chdir("C://Users//For Programming//Documents//Python Scripts3") 15df = identification_filetype("AAA.csv") 16df

補足

ちなみに read_table() は 0.24.0 で deprecated (廃止) された API なので、read_csv() で sep="\t" を指定して読み込むほうが好ましいです。

pandas.read_table — pandas 0.24.2 documentation

python

1import os 2 3import pandas as pd 4 5 6def identification_filetype(path): 7 _, ext = os.path.splitext(path) 8 if ext == ".csv": 9 # カンマ区切り 10 return pd.read_csv(path, encoding="shift-jis") 11 elif ext == ".txt": 12 # タブ区切り 13 return pd.read_csv(path, encoding="shift-jis", sep="\t") 14 15 16os.chdir("C://Users//For Programming//Documents//Python Scripts3") 17df = identification_filetype("AAA.csv") 18df

投稿2019/06/17 13:45

編集2019/06/17 13:57
tiitoi

総合スコア21956

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

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

Danrussia

2019/06/17 14:09 編集

回答ありがとうございます。自分の中にあったあやふやなものがコード化できました。 ひとまずはデータを読み込む所までは行えたのですが、出力される結果が読込形式が違った時のような感じになってしまっているのですが、この点に関しては自分で推察できないのですが、どうすれば良いでしょうか?
Danrussia

2019/06/17 14:09

読込形式がおかしくなっている感じの画像を上に添付します。
tiitoi

2019/06/17 14:12

"AAA.csv" をどこかにアップロードすることはできますか?
Danrussia

2019/06/17 14:14

できなくもないのですが"AAA.csv"を簡易的に表現したものを乗っけますね
Danrussia

2019/06/17 14:32

確かに"AAA.csv"のファイルがなぜ読み込めないのか疑問に思い、自分のPC内にあった他のtxtファイルやcsvファイルも読み込んでみた所、"AAA.csv”のファイルだけなぜか読み込めませんでした。 なぜ”AAA.csv"ファイルだけが読みこめないかは疑問には残るのですが、大方の目的は達成できたので ひとまず今回は無事解決しました。 親身な回答ありがとうございました。
guest

0

恐らく文法的な間違いはないと思うのですが、エラーコードから察するに「os.path.splitext(df1)」の部分で

df1から上手くファイルの拡張子を受け取れてないような感じがするのですが、解決策が分かりません。

この部分ではなく、

pd.read_table(df1, encoding="shift-jis")

の部分で発生しているように思います。

一度、if文の中で、
print(ext)などを差し込み、実行してみて、エラーになるか確認してみてください!

もしくは、

$ python >>>

の中で、一行ずつ確認しながら実行するのもありかもしれません。

投稿2019/06/17 12:23

tail12

総合スコア607

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

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

Danrussia

2019/06/17 13:28

ご指摘ありがとうございます。 if文の中にprintを入れてみたのですが特にエラーコードは排出されなかったです。 何が原因でエラーコードが出なくなったのかが分からないのですが、現在の起きている問題について記述しなおしたので一読して頂ければ幸いです。
guest

0

.txt の中身が気になります。
pandas の read_table では区切り文字が \t の認識ですが、区切り文字はあっていますでしょうか。

投稿2019/06/17 12:19

編集2019/06/17 12:40
shaw

総合スコア209

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

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

Danrussia

2019/06/17 13:29

ご指摘ありがとうございます。 is の概念については全く知らなかったので教えて頂きありがとうございました。 データフレームも画像形式で載せておきました。 何が原因でエラーコードが出なくなったのかが分からないのですが、現在の起きている問題について記述しなおしたので一読して頂ければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問