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

2024-10-03 06:25:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在使用通配符的同时读取多个excel文件,并使用pandas将其放入saparate数据帧中

我已阅读基本路径,并将使用下面的内容访问子目录:

>>>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')

有没有办法做到这一点


Tags: 文件namedfreadxlsxexcelglobsheet
3条回答

可以像这样简单地填充数据帧字典:

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

您还可以使用for循环来运行您需要为每个文件执行的作业,这不需要知道文件名。此外,还可以将所有电子表格读入一个df,并确保有一个额外的列具有每行对应的文件名

下面的代码假设每个国家都有几个文件,需要对它们进行排序以查找最近一周的情况

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方法搜索路径中具有国家名称的所有文件,使用regex提取周数,对它们进行排序以查找最大的编号,然后从与找到的最近一周匹配的所有国家/地区文件的全局返回文件路径

如果您的文件总是有一个_要拆分,您可以创建一个字典,将拆分值作为键,文件路径作为位置

让我们使用在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=...)

相关问题 更多 >