自动化在Python中合并CSV文件的过程

时间:2017-08-06 19:35:09

标签: regex python-3.x csv

我正在尝试使用存储在数据文件夹中的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']

关于如何使用或不使用正则表达式来实现此目的的任何建议?

3 个答案:

答案 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