我正在尝试使用存储在数据文件夹中的12个不同的csv文件。我有一个单独打开每个文件的函数(openFile)并对数据执行特定的计算。然后我希望能够将函数应用于每个文件。文件的名称都与此类似:UOG_001-AC_TOP-Accelerometer-2017-07-22T112654.csv。下面的代码显示了我计划如何将文件读入openFile函数:
for file in os.listdir(DATA_PATH + 'datafolder/'):
if file.endswith('.csv'):
abs_path = os.path.abspath(DATA_PATH + 'datafolder/' + file)
print(abs_path)
data = openFile(abs_path)
data2 = someFunction(data)
我需要合并特定文件,文件名中包含相同的两个字母。最后我应该有6个文件而不是12个。文件不是按照需要在数据文件夹中合并的顺序存储的,因为这最终会导致用于大量文件。这些文件都有相同的标题
我是否能够提供两个字母的列表,这两个字母是文件中要在正则表达式中使用的关键字? e.g。
list = ['AC', 'FO', 'CK', 'OR', 'RS', 'IK']
关于如何使用或不使用正则表达式来实现此目的的任何建议?
答案 0 :(得分:0)
您可以浏览文件树,然后根据文件名的前两个字母保存需要合并的每对文件。
fileList = {'AC':[], 'FO':[], 'CK':[], 'OR':[], 'RS':[], 'IK':[]}
for file in os.listdir(DATA_PATH + 'datafolder/'):
if file.endswith('.csv'): #Ensure we are looking at csv
#Add the file to its correct bucket based off of the letters in name
fileList[extractTwoLettersFromFileName(file)].append(file)
for twoLetters, files in fileList.items():
mergeFiles(files)
我没有提供提取字母和合并文件的实现,但是从你的问题来看,你似乎已经有了这个实现。
答案 1 :(得分:0)
您可以先进行简单的子字符串检查,然后再根据它将文件名分组:
letters_list = ['AC', 'FO', 'CK', 'OR', 'RS', 'IK']
for letters in letters_list:
if letters in filename:
filename_list = filename_dict.get(letters, list())
filename_list.append(filename)
filename_dict[letters] = filename_list
答案 2 :(得分:0)
以下是来自Path
的{{1}}对象,用于创建名称以' .csv'结尾的文件列表。然后我使用一个函数检查每个文件的名称,看看是否存在使用正则表达式提到的那些字符串中的一个或另一个,这样我就可以用它们的关联文件名创建这些字符串对的列表。请注意,此对列表的长度为12,并且可以从此恢复文件名。
制作完该列表后,我可以使用pathlib
中的groupby
来创建在itertools
列表中共享这些字符串的双元素文件列表。您可以合并这些列表中的项目。
file_kinds
用于从>>> from pathlib import Path
>>> file_kinds = ['AC', 'FO', 'CK', 'OR', 'RS', 'IK']
>>> def try_match(filename):
... m = re.search('(%s)'%'|'.join(file_kinds), filename)
... if m:
... return m.group()
... else:
... return None
...
>>> all_files_list = [(item, try_match(item.name)) for item in list(Path(r'C:/scratch/datafolder').glob('*.csv')) if try_match(item.name)]
>>> len(all_files_list)
12
提取完整路径的表达式:
all_files_list