我有一个包含子目录的目录,所有的子目录都包含具有以下名称结构的文件:
daily_report_yyy-mm-dd.csv其中yyyy-mm-dd是自2020年初以来的日期,频率为1(天)。
在一个项目中,我只需要引用过去七天的文件,因此我认为读取所有文件然后对结果数据帧进行切片是没有用的。此脚本执行jsut,读取所有文件并将它们连接到onle单个df中
path = path_to_downloads
extension = '.csv'
files_w_path =[]
for root, dirs_list, files_list in os.walk(path):
for file_name in files_list:
if os.path.splitext(file_name)[-1] == extension:
file_name_path = os.path.join(root, file_name)
files_w_path.append(file_name_path)
df = []
for filename in files_w_path:
df.append(pd.read_csv(filename))
vehicle = pd.concat(df, ignore_index=True)现在,我想使用脚本执行的日期,并查找包含该日期的所有文件作为名称的一部分,以及该日期之前的所有七天。我已经考虑过使用下面的代码,但我不知道如何继续。
base = datetime.date.today()
list_of_files =[]
for date in pd.date_range(base, base-7, freq='D').strftime('%Y-%m-%d'):
for file_name in files[files.str.contains(date)]:
list_of_files.append(filename)任何指导都将不胜感激。
发布于 2021-04-13 02:21:43
为了使其健壮,您应该利用内置的datetime库,并使用re对文件名进行模式匹配。如果某些内容与预期的模式不匹配,则可以打印文件名并进一步调查。下面的函数应该会给你想要的东西。
import datetime
import os
import re
pattern = re.compile(r"(?<=daily_report_)[0-9-]+(?=\.csv)")
def valid_files(path):
delta = datetime.timedelta(days=7)
now = datetime.date.today()
threshold = now - delta
output = []
for _, _, files in os.walk(path):
for fin in files:
if fin.endswith(".csv"):
try:
ts = ts_parser(fin)
# catch regex and date parsing errors
except (IndexError, ValueError):
print(f"{fin} does not match the pattern")
continue
if ts >= threshold:
output.append(fin)
return output
def ts_parser(fname):
matched = pattern.search(fname).group(0)
ts = datetime.datetime.date(
datetime.datetime.strptime(matched, "%Y-%m-%d")
)
return ts假设我有一个具有以下结构的目录。
so/
├── daily_report_2020-09-21.csv
├── daily_report_2021-04-04.csv
├── daily_report_2021-04-05.csv
├── daily_report_2021-04-06.csv
├── daily_report_2021-04-12.csv当我运行如下所示的函数时,我们得到了想要的结果。
valid_files("./so/")
>> ['daily_report_2021-04-06.csv',
'daily_report_2021-04-12.csv',
'daily_report_2021-04-05.csv']发布于 2021-04-13 02:34:16
我还使用regex和pathlib库实现了答案。
from pathlib import Path
from datetime import datetime, timedelta
import re
regex = re.compile(".{1,}\\d{4,4}\\-(0{0,1}[1-9]|1[012])\\-(0{0,1}[1-9]|[12][0-9]|3[01])$")
path = Path('.')
result = []
delta = timedelta(days=7)
for csv_file in path.glob("**/*.csv"):
matchArray = regex.findall(csv_file.stem)
if len(matchArray)> 0:
file_date = datetime.strptime(csv_file.stem[-10:], '%Y-%m-%d')
if file_date.date() > datetime.now().date() - delta:
result.append(csv_file.absolute()) # if you need relative path use result.append(csv_file)
print(result)您可以在路径构造函数- Path()中指定路径。
Path('.') means the path of the current working directory where the python is located.现在,从目录和所有子目录中提取所有CSV文件。
path.glob('**/*.csv')-它将返回生成器对象。因此,如果您有大量的CSV文件,则速度会很快。使用正则表达式匹配您在上面指定的文件模式,并且只处理过滤后的CSV文件。然后,我使用timedelta函数来检查最新的文件。最后,将结果附加到列表结果中。
https://stackoverflow.com/questions/67062958
复制相似问题