熊猫:使用正则表达式读取文件

时间:2020-05-20 01:13:30

标签: python regex pandas dataframe glob

我正在尝试在使用通配符的同时读取多个Excel文件,并使用熊猫将其放入明智的数据帧中。

我已经阅读了基本路径,并将在下面用于访问子目录:

>>>inputs_path
'C:/Users/ABC/Downloads/Input'
>>>path1 = os.chdir(inputs_path + "/path1")
>>>fls=glob.glob("*.*")
>>>fls

['Zambia_W4.xlsm',
 'Australia_W4.xlsx',
 'France_W4.xlsx',
 'Japan_W3.xlsm',
 'India_W3.xlsx',
 'Italy_W3.xlsx',
 'MEA_W5.xlsx',
 'NE_W5.xlsm',
 'Russia_W5.xlsx',
 'Spain_W2.xlsx']
>>>path2 = os.chdir(inputs_path + "/path2")
>>>fls=glob.glob("*.*")
>>>fls

['Today.xlsm',
 'Yesterday.xlsx',
 'Tomorrow.xlsx']

现在我正在阅读它们,如下所示:

>>>df_italy = pd.read_excel("Italy_W3.xlsx",sheet_name='Sheet1')
>>>df_russia = pd.read_excel("Russia_W5.xlsx",sheet_name='Sheet3')
>>>df_france_1 = pd.read_excel("France_W4.xlsx",sheet_name='Sheet1', usecols = 'M, Q', skiprows=4)
>>>df_spain = pd.read_excel("Spain_W2.xlsx",sheet_name='Sheet2',usecols = 'T:U', skiprows=30 )
>>>df_ne = pd.read_excel("NE_W5.xlsm",sheet_name='Sheet2',usecols = 'N,P', skiprows=4 )
>>>df_ne_c = pd.read_excel("NE_W5.xlsm",sheet_name='Sheet1',usecols = 'H:J', skiprows=141 )

由于我在列表fls中有文件名,因此有一种方法可以使用该列表并读取文件而无需实际使用实际文件名,因为文件名会根据周数更改。 另外,在读取excel文件时必须保留上述数据框名称。

我希望将文件读取为

>>>df_italy = pd.read_excel("Italy*.xlsx",sheet_name='Sheet1')

有什么办法吗?

3 个答案:

答案 0 :(得分:1)

如果文件上总是有_可以拆分,则可以创建一个字典,其中拆分值作为键,文件路径作为位置。

让我们使用Python 3.4+中添加的Pathlib,因为它更易于与文件系统一起使用。

正则表达式匹配文件名。

假设您的字典是按照上面创建的,文件名和路径是我们可以做到的值。您需要扩展该功能以处理多个文件匹配项。

import re
from pathlib import path

file_dict = {file.stem : file for file in location.glob('*.xlsx')}

# assume the numbers are paths.
files = {'Zambia_W4.xlsm': 2,
 'Australia_W4.xlsx': 5,
 'France_W4.xlsx': 0,
 'Japan_W3.xlsm': 7,
 'India_W3.xlsx': 2,
 'Italy_W3.xlsx': 6,
 'MEA_W5.xlsx': 7,
 'NE_W5.xlsm': 4,
 'Russia_W5.xlsx': 3,
 'Spain_W2.xlsx': 5}

def file_name_match(file_dict,pattern):

    for name, source in file_dict.items():
        if re.search(pattern,name,flags=re.IGNORECASE):
            return file_dict.get(name)

file_name_match(file_dict,'italy')
output: 6

df = pd.read_excel(file_name_match(file_dict,'italy'),sheetname=...)

答案 1 :(得分:0)

简单地像这样填充数据帧字典可能是可行的:

my_dfs = {}
for f in fls:
    my_dfs[f.split(“.”)[0]] = pandas.dataframe(f.split(“,”)[0], ...)

您也可以使用for循环来仅运行每个文件所需的作业,而无需了解文件名。另外,也可以将所有电子表格读入一个df文件,并确保还有另外一列,每一行都有对应的文件名。

答案 2 :(得分:0)

下面的代码假设您每个国家/地区都有多个文件,并且需要对它们进行排序以查找最近的一周。

import glob
import os
import re

def find_country_file(country_name):
  all_country_files = glob.glob(os.path.join(inputs_path, '{0}_W*.*'))
  week_numbers = [re.search('W([0-9]+)', x) for x in all_country_files]
  week_numbers = [int(x.group(1)) for x in week_numbers if x is not None]
  latest_week_number = sorted(week_numbers, reversed=True)[0]
  latest_country_file = [x for x in all_country_files if 'W{0}.'.format(latest_week_number) in x]
  return os.path.basename(latest_country_file)


df_italy = pd.read_excel(find_country_file('Italy') , sheet_name='Sheet1')
df_russia = pd.read_excel(find_country_file('Russia'), sheet_name='Sheet3')
df_france_1 = pd.read_excel(find_country_file('France'),sheet_name='Sheet1', usecols = 'M, Q', skiprows=4)
df_spain = pd.read_excel(find_country_file('Spain'),sheet_name='Sheet2',usecols = 'T:U', skiprows=30 )
df_ne = pd.read_excel(find_country_file('NE'),sheet_name='Sheet2',usecols = 'N,P', skiprows=4 )
df_ne_c = pd.read_excel(find_country_file('NE'),sheet_name='Sheet1',usecols = 'H:J', skiprows=141)

find_country方法搜索路径中具有国家名称的所有文件,使用正则表达式提取星期数,对它们进行排序以找到最高的数字,然后从匹配的所有国家文件的全局列表中返回文件路径找到最近的一周。