python - 如何组合名称包含来自两个字典的单词的 CSV 文件?
问题描述
我有一个包含多个文件的文件夹:
files = ['apple29c9_michigan_1995.csv',
'apple30c7_rome_1995.csv',
'apple67c5_melba_1995.csv',
'apple12c2_rome_2010.csv',
'mango76c6_southern_blush_1995.csv',
'mango76c6_southern_1995.csv',
'mango76c6_blush_1995.csv',
'mango65c2_southern_blush_2020.csv',
'mango34c4_keitt_1995.csv',
'mango22c5_kent_1995.csv',
'mango76c6_southern_blush_sweet_1995.csv',
'mango76c6_sweet_southern_blush_1995.csv']
我有两个字典和一个变量(制造年份):
d1 = {'Filename': ['apple','mango']}
d2 = {'Filetype': ['rome', 'melba', 'southern_blush', 'kent']}
yr = 1995
我怎样才能:
从文件夹中选择所有文件,其中文件名包含:
- 要么
Filename
,'apple'
要么'mango'
- AND 任何
Filetype
,'rome'
,'melba'
,'southern_blush'
, 或'kent'
- 必须完全匹配(例如
sweet_southern_blush
不等于southern_blush
)
- 必须完全匹配(例如
- 和
yr
, 如 1995
- 要么
将属于每个文件名的文件附加在一起。
- 苹果的一个文件,该文件将具有
apple30c7_rome_1995.csv
并apple67c5_melba_1995.csv
附加 - 同样,芒果文件的一个文件。
- 苹果的一个文件,该文件将具有
输出应该是:
apple30c7_rome_1995.csv
apple67c5_melba_1995.csv >> Appended into one file
mango76c6_southern_blush_1995.csv
mango22c5_kent_1995.csv >> Appeneded into one file
解决方案
使用
pathlib
模块获取所有文件预先创建术语的组合 ,
combos
。遍历文件,并在通过条件时将文件添加到
dict
,files_to_combine
。f_name
被分成一个列表_
fn = f_name[0]
始终是Filename
组件,因此它必须包含n
,因此n in fn
y = f_name[-1]
总是年份,所以它必须等于yr
,因此yr == y
ft = f_name[1:-1]
是Filetype
组件,因此它必须与中的任何值完全匹配t
- 对于发电机
any(v == ft for v in t)
- 从
for-loop
,t
是['rome', 'melba', 'southern_blush', 'kent']
并v
遍历 的每个值t
。 v == ft
创建一个布尔值True
或False
如果v
是ft
或不是。any
True
如果生成器中的任何布尔值是 ,则返回True
。- 要在完全
str
匹配或包含str
、 选择==
或之间进行切换in
。
- 从
使用
pandas.read_csv
,pandas.concat
和pandas.DataFrame.to_csv
读取、组合和写入 csv 文件。- 对于此示例,创建了两个文件,
apple_1995.csv
并且mango_1995.csv
.
- 对于此示例,创建了两个文件,
import pandas as pd
from pathlib import Path
from collections import defaultdict as dd
yr = str(yr) # convert year to a str
combos = [[n] + [d2['Filetype']] for n in d1['Filename']] # list of unique combination
# find files in specified path
files = Path('c:/path_to_files').glob('*.csv')
# group matching combos in a dict
files_to_combine = dd(list)
for file in files:
f_name = file.stem.split('_') # get the file name and split it into a list
y = f_name[-1] # year
fn = f_name[0] # filename string
ft = '_'.join(f_name[1:-1]) # filetype string
for (n, t) in combos: # iterate through each list in combos
if (n in fn) and (yr == y) and any(v == ft for v in t): # check the conditionals
files_to_combine[f'{n}_{yr}'].append(file) # add to the appropriate dict key
# combine csv groups into one group
for k, v in files_to_combine.items():
df = pd.concat([pd.read_csv(file) for file in v])
df.to_csv(f'{k}.csv', index=False)
combos
[['apple', ['rome', 'melba', 'southern_blush', 'kent']],
['mango', ['rome', 'melba', 'southern_blush', 'kent']]]
files_to_combine
defaultdict(<class 'list'>,
{'apple_1995': [WindowsPath('apple30c7_rome_1995.csv'),
WindowsPath('apple67c5_melba_1995.csv')],
'mango_1995': [WindowsPath('mango76c6_southern_blush_1995.csv'),
WindowsPath('mango22c5_kent_1995.csv')]})
推荐阅读
- xamarin.forms - 无法使用正确的设置访问 AzureAD 中的公司租户
- vue.js - 如何在 Vuetify 应用程序中使用大纲图标?
- c# - 无法在视图上添加“at sign”
- php - 管理员在表单中为所有用户重置密码字段
- http-headers - Haproxy 为子域添加响应头
- ruby-on-rails-5 - Mongoid 7.0.1 中的多文档 ACID 事务
- c# - 在 MVC 的存储库模式中使用接口的优点是什么
- reactjs - React/Redux - 获取和过滤大量数据
- sql-server - 在 SQL SERVER 中获取当前学期
- html - 使用按钮显示和隐藏带有 iframe 的特定 div