【问题标题】:Revisit "How to find the position/index of a particular file in a directory?"重温“如何在目录中查找特定文件的位置/索引?”
【发布时间】:2021-09-11 13:22:14
【问题描述】:

我有一个来自以下讨论的问题:

How to find the position/index of a particular file in a directory?

假设我在一个文件夹中有三个 excel 文件test_3d、test_3d1、test_3d2

它说我们可以从以下代码中读取文件的索引

folder = r'C:\Users\Denny\Desktop\Work\test_read'
files = os.listdir(folder)
files.index('test_3d1.xlsx')

>> 1

另外,我们可以通过

读取每个文件的数据
folder = r'C:\Users\Denny\Desktop\Work\test_read'
files = os.listdir(folder)
dfs = {}
for file in files:
    if file.endswith('.xlsx'):
        dfs[file[:-5]] = pd.read_excel(os.path.join(folder,file), header = None, skiprows=[0], usecols = "B:M")

dfs['test_3d1']

此外,我们可以使用显示其所有文件

files
>> ['test_3d.xlsx', 'test_3d1.xlsx', 'test_3d2.xlsx']

我现在的问题是如何通过文件名获取每个文件的数据

dfs['test_3d1']

但通过它的索引,例如

dfs['files[1]']   # I want to pick up the 2nd file 'text_3d1' from files.

但是显示错误

如何解决这个错误?

【问题讨论】:

    标签: python excel pandas


    【解决方案1】:

    如果您想根据您发布的屏幕截图查看字典中的值,您可以这样做:dfs[files[1][:-5]]。这将获取索引 1 处的文件,然后排除文件扩展名,就像您在构建 dfs 字典的步骤中所做的那样。

    或者,您可以使用可用于字典的__missing__ method 来更改字典中不存在的键的处理方式。使用recipe from this answer,您可以使用dictionary values() 上的查找或修改键以删除文件扩展名,然后返回该键的值。因此,您可以将其与dfs[files[1]] 一起使用,而无需每次都剥离扩展。

    In [1]: class smart_dict(dict):
       ...:     def __missing__(self, key):
       ...:         if isinstance(key, int):             # skip this if you don't plan
       ...:             return list(self.values())[key]  # to use ints directly
       ...:             # or
       ...:             # return self[list(self.keys())[key]]
       ...:         if key.endswith('.xlsx'):
       ...:             return self[key[:-5]]
       ...:         raise KeyError(key)
       ...:
    
    In [2]: dfs = smart_dict()
       ...: dfs['a'] = 'A'
       ...: dfs['b'] = 'B'
    
    In [3]: dfs['a']  # normal usage
    Out[3]: 'A'
    
    In [4]: dfs[0]  # index-based lookup
    Out[4]: 'A'
    
    In [5]: dfs[1]
    Out[5]: 'B'
    
    In [6]: dfs['a.xlsx']  # lookup with the filename
    Out[6]: 'A'
    
    In [7]: dfs['does not exist']  # still raises KeyError
    ...
    KeyError: 'does not exist'
    
    In [8]:  dfs['nope.xlsx']  # also raises KeyError
    ...
    KeyError: 'nope'
    

    顺便说一句,因为values() 不能直接索引,所以不断地对整数键进行list(dict.values())[index] 查找会产生开销。所以避免使用它。 '.xlsx' 扩展删除查找是可以的,因为它只是删除扩展,然后直接将其用作键。

    【讨论】:

      【解决方案2】:

      在这段代码中注意您正在使用的对象类型:

      folder = r'C:\Users\Denny\Desktop\Work\test_read'
      files = os.listdir(folder)
      dfs = {}
      for file in files:
          if file.endswith('.xlsx'):
              dfs[file[:-5]] = pd.read_excel(os.path.join(folder,file), header = None, skiprows=[0], usecols = "B:M")
      
      dfs['test_3d1']
      

      注意dfs 是一个字典,所以我们通过它的key 访问文件,这里我们将key 定义为名称的文件。
      如果您希望将其更改为它的索引,请像这样存储它:

      folder = r'C:\Users\Denny\Desktop\Work\test_read'
      files = os.listdir(folder)
      dfs = {}
      # Here is the change
      for i,file in enumerate(files):
          if file.endswith('.xlsx'):
              dfs[i] = pd.read_excel(os.path.join(folder,file), header = None, skiprows=[0], usecols = "B:M")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 2015-09-10
        • 2019-10-23
        • 2022-01-14
        • 1970-01-01
        相关资源
        最近更新 更多