我正在尝试使用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个。这些文件不是按照它们需要在数据文件夹中合并的顺序存储的,因为这最终将导致用于更多数量的文件。这些文件都有相同的头文件
我是否可以提供文件中要在regex中使用的关键字的两个字母的列表?例如:
list = ['AC', 'FO', 'CK', 'OR', 'RS', 'IK']对于如何在使用或不使用正则表达式的情况下实现此目标,有什么建议吗?
发布于 2017-08-07 03:45:18
您可以遍历文件树,然后根据文件名的前两个字母,保存需要合并的每对文件。
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)我没有提供提取字母和合并文件的实现,但从您的问题看,您似乎已经有了该实现。
发布于 2017-08-07 03:45:34
您可以首先进行简单的子字符串检查,然后根据检查结果对文件名进行分组:
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发布于 2017-08-07 06:55:10
下面是来自pathlib的Path对象,用于创建名称以“.csv”结尾的文件列表。然后,我使用一个函数来检查每个文件的名称是否存在您使用正则表达式提到的那些字符串中的一个或另一个,这样我就可以创建这些字符串及其关联文件名对的列表。请注意,此对列表的长度为12,并且可以从中恢复文件名。
创建了该列表后,我可以使用itertools中的groupby创建包含两个元素的文件列表,这些文件共享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中提取完整路径的表达式
[str(_[0]) for _ in all_files_list]
>>> for kind, files_list in groupby(all_files_list, key=itemgetter(1)):
... kind, [str(_[0]) for _ in list(files_list)]
...
('AC', ['C:\\scratch\\datafolder\\UOG_001-AC_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-AC__B_TOP-Accelerometer-2017-07-22T112654.csv'])
('CK', ['C:\\scratch\\datafolder\\UOG_001-CK_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-CK__B_TOP-Accelerometer-2017-07-22T112654.csv'])
('FO', ['C:\\scratch\\datafolder\\UOG_001-FO_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-FO__B_TOP-Accelerometer-2017-07-22T112654.csv'])
('IK', ['C:\\scratch\\datafolder\\UOG_001-IK_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-IK__B_TOP-Accelerometer-2017-07-22T112654.csv'])
('OR', ['C:\\scratch\\datafolder\\UOG_001-OR_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-OR__B_TOP-Accelerometer-2017-07-22T112654.csv'])
('RS', ['C:\\scratch\\datafolder\\UOG_001-RS_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-RS__B_TOP-Accelerometer-2017-07-22T112654.csv'])https://stackoverflow.com/questions/45535861
复制相似问题