10

私はPythonに比較的慣れていないので、複数のファイルから単一の配列にデータをインポートするのに最適な方法を考えています。次のような2列のデータ(列区切り)の50行を含むかなりの数のテキストファイルがあります。

Length=10.txt:     
1, 10    
2, 30    
3, 50   
#etc
END OF FILE

-

Length=20.txt
1, 50.7
2, 90.9
3, 10.3
#etc
END OF FILE

dataという変数にインポートおよびインポートするテキストファイルが10個あるとします。

すべてのデータを含む単一の3D配列を作成したいと思います。そうすれば、テキストファイルのインデックスを参照するdata[:,:,n]場所でデータを参照することにより、データを簡単にプロットおよび操作できます。n

私がこれを行う方法は、形状の配列(50、2、10)を持つことだと思いますが、Pythonを使用してそれを作成するのに最適な方法がわかりません。ループを使用して各テキストファイルを2D配列としてインポートし、それらをスタックして2D配列を作成することを考えましたが、これを行うための適切なコマンドが見つかりませんでした(numpyでvstackとcolumn_stackを調べましたが、これらは余分な次元を追加しないようです)。

これまでのところ、インポートコードを記述しました。

    file_list = glob.glob(source_dir + '/*.TXT') #Get folder path containing text files

    for file_path in file_list:
      data = np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18)

しかし、このコードの問題は、データがforループにある場合にのみデータを処理できることです。

私が本当に欲しいのは、テキストファイルからインポートされたすべてのデータの配列です。

どんな助けでも大歓迎です!

4

5 に答える 5

7

「しかし、このコードの問題は、データがforループにある場合にのみデータを処理できることです。」

コードが機能すると仮定します。

# Get folder path containing text files
file_list = glob.glob(source_dir + '/*.TXT')
data = []
for file_path in file_list:
    data.append(
        np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18))
# now you can access it outside the "for loop..."
for d in data:
    print d
于 2012-11-29T14:27:41.997 に答える
1

[txt column1、txt column2、filename]の配列をお探しですか?

file_list = glob.glob(source_dir + '/*.TXT') #Get folder path containing text files


for num,file_path in enumerate(file_list):
  data = np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18)
  data = np.vstack((data.T,np.ones(data.shape[0])*num)).T
  if num==0: Output=data
  else: Output=np.vstack((Output,data))

2回転置したくない場合の代替手段。

  data = np.vstack((data,(np.ones(data.shape[0])*num).reshape(-1,1)))
于 2012-11-29T14:25:51.837 に答える
1

すべてのデータが同じ形状の場合は、リストに追加するだけです。

all_data = [] 

そしてあなたのループで:

all_data.append(data)

最後にあなたは持っています

asarray(all_data)

これは形状の配列(10,50,2)です(必要に応じて転置します)。形状が一致しない場合、これは機能しませんが、numpyは異なる形状の行を処理できません。次に、最大の形状の配列を作成し、データをコピーする別のループが必要になる場合があります。

于 2012-11-29T14:27:22.320 に答える
1

粗雑だが速い

listFiles=["1.txt","2.txt", ... ,"xxx.txt"]
allData=[]
for file in listFiles:
    lines = open(file,'r').readlines()

    filedata = {}
    filedata['name'] = file
    filedata['rawLines'] = lines
    col1Vals = []
    col2Vals = []
    mapValues = {}

    for line in lines:           
       values = line.split(',')
       col1Vals.append(values[0])
       col2Vals.append(values[1])
       mapValues[values[0]] = values[1]
    filedata['col1'] = col1Vals
    filedata['col2'] = col2Vals
    filedata['map'] = mapValues
    allData.append(filedata)


特定のディレクトリからファイルのリストを取得したい場合は、os.walkをご覧ください。

データがどのように必要になるかが明確ではないため、データを保存する方法をいくつか示しました。

allData辞書のリストです

3番目のファイルから2番目の列のデータを取得するにはallData[2]['col2']

3番目のファイルの名前が必要な場合alldata[2]['name']

于 2012-11-29T14:38:23.367 に答える
0

多分あなたはこのようにすることができます:

file_list = glob.glob(source_dir + '/*.TXT') # Get folder path containing text files
data = [np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18)
        for file_path in file_list]
于 2013-05-28T22:01:08.647 に答える