2016-08-11 10 views
3

私は、複数のCSVファイルを読むためにループを使用しようとしています。現在の作業ディレクトリ内のすべてのCSVファイルを正しいファイル名のパンダに読み込む

私は、pandasの各データフレームを、自分のフォルダのファイル拡張子を除いて同じ名前にしたいと思います。その後、両方の「地震」、私のファイルのリストに私の2つのファイルが(そのために)weather_today、earthquakes.csvであれば例えば

or each_file in files: 
    frame = pd.read_csv(each_file) 
    filename_only = os.path.splitext(each_file)[0] 
    # Right below I am assigning my looped data frame the literal variable name of "filename_only" rather than the value that filename_only represents 
    #rather than what happens if I print(filename_only) 
    filename_only = frame 

import os 
import pandas as pd 


files = filter(os.path.isfile, os.listdir(os.curdir)) 
files # this shows a list of the files that I want to use/have in my directory- they are all CSVs if that matters 

# i want to load these into pandas data frames with the corresponding filenames 

# not sure if this is the right approach.... 
# but what is wrong is the variable is named 'weather_today.csv'... i need to drop the .csv or .xlsx or whatever it might be 

for each_file in files: 
    frame = pd.read_csv(each_file) 
    each_file = frame 

バーニーは素晴らしいことが、1つの問題のようです「天気」は作成されません。

しかし、単に「filename_only」と入力してpythonでenterキーを押すと、地震データフレームが表示されます。 100個のファイルがある場合、リストループの最後のデータフレーム名は 'filename_only'となり、他の99は前回の割り当てが行われず100番目のファイルが上書きされるため、99になりません。

答えて

2

には、「パス名のパスを(root、ext)に分割してroot + ext == pathとし、extを空にするか、ピリオドで始まり最大で1ピリオドまで入れる」ことができます。

for each_file in files: 
    frame = pd.read_csv(each_file) 
    filename_only = os.path.splitext(each_file)[0] 
    filename_only = frame 

私たちは、あなたがこのような何かを行うことができますので、ちょうどCSVファイルをフィルタリングする方法をご希望のコメントで尋ねたとおり:あなたのフレームを保存するために辞書を使用し

files = [file for file in os.listdir(os.curdir) if file.endswith(".csv")] 
+1

すごく簡単です。 files = filter(os.path.isfile、os.listdir(os.curdir)) -----これを指定して特定の拡張子にする方法があります。私はこの種のものに新しいです... – runningbirds

+0

確かに私は私の答えにそれを追加します... – bernie

+0

@runningbirds:編集を参照してください。 – bernie

1

frames = {} 

for each_file in files: 
    frames[os.path.splitext(each_file)[0]] = pd.read_csv(each_file) 

今、あなたとあなたの好みのデータフレームを取得することができます:

frames[filename_without_ext] 

シンプル、右?しかし、RAMの使用には注意してください。たくさんのファイルを読むと、すぐにシステムのメモリがいっぱいになり、クラッシュする可能性があります。

+0

はい、これは機能し、上記の方法は機能しません。上記の中間的な印刷ステップを使用しようとすると、名前が得られますが、上記の答えの最後の部分は、割り当てでは動作しないようです...また、リストではなくメモリにディレクトリをロードしたいと思います。 – runningbirds

+0

これは辞書であり、リストではありません。両者には大きな違いがあります。 @ bernieの答えが正しくコピーされていると思いますか?あなたが求めていることは、厳密に行うことはできません。あなたのプログラムがコードを書いて実行しない限り、変数を宣言することはできません。実行中のコードはPythonでは変更できません。あなたが行うことができる唯一のことは、変数を変更することです。ディクショナリでは、名前を付ける名前付きキーを使用できます。それは私の答えがしていることであり、あなたの質問に答えるのが一番簡単な方法です。 – Kartik

+0

OK、私はその部分は理解していますが、間違っているのは、FILENAME_ONLYがFILENAME_ONLYではなくスペルのweather_dataの抽出を実行するのではなく、変数 "FILENAME_ONLY" = weather_data.csvのスペルとして使用されているということですweather_data = weather_data.csvを設定する – runningbirds

関連する問題