如何从子目录导入特定扩展名的所有文件并单独保存?

时间:2017-06-29 23:04:30

标签: python numpy import glob

我有一个目录

* workingdir
  * raw_data
      * 2001
         - a.dat
         - b.dat
         - c.dat
      * 2002
         - d.dat
         - e.dat
         - f.data

       * 2003 etc.

如何将这些dat文件读入单独的变量?

到目前为止:

import os                 # Operating system interface
import glob               # For Unix style pathnames
import numpy as np        

workingdir = '/home/x/workingdir/'

#Directory for all raw data files
rawdatadir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir, "raw_data")) 

for root, dirs, files in os.walk(rawdatadir):
    for files in [f for f in files if f.endswith(".dat")]:
        print(os.path.join(rawdatadir, files))


But this is giving me

/home/x/workingdir/raw_data/a.dat
/home/x/workingdir/raw_data/b.dat

所以,

  1. 如何获取所有文件的完整路径
  2. 并导入它们(np.fromfile?)
  3. 任何"更聪明"这样做的方法?
  4. 我来自R / dataframe背景,并且更愿意模仿附近的东西。

2 个答案:

答案 0 :(得分:0)

os.path.join(rawdatadir, files)替换为os.path.join(root, files)

可以获得完整路径

root变量包含files中列出的文件所在的目录路径。 正确的循环实现将是:

如果您想通过文件名

访问,可以使用dict存储结果
results = {}

for root, dirs, files in os.walk(rawdatadir):
    for file in filter(lambda f: f.endswith('.dat'), files):
        results[file] = np.fromfile(os.path.join(root, file))

答案 1 :(得分:0)

使用glob查找子目录中的所有文件,遍历列表并存储名称和内容。其recursive选项允许令牌**将包含子目录的任何路径匹配到搜索中。

from glob import iglob
import os.path
workingdir = '/home/x/workingdir/'

result = {}
for f in iglob(os.path.join(workingdir, './**/*.dat'), recursive=True):
    result[f] = np.fromfile(os.path.abspath(f))

这个可爱的单一发生器还允许我们以漂亮的pythonic形式表达它

files = iglob(os.path.join(workingdir, './**/*.dat'), recursive=True)
result = {f: np.fromfile(os.path.abspath(f)) for f in files}