首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中自动执行合并CSV文件的过程

在Python中自动执行合并CSV文件的过程
EN

Stack Overflow用户
提问于 2017-08-07 03:35:09
回答 3查看 39关注 0票数 0

我正在尝试使用12个不同的csv文件,这些文件存储在数据文件夹中。我有一个单独打开每个文件的函数(openFile),并对数据执行特定的计算。然后,我希望能够对每个文件应用一个函数。这些文件的名称都类似于: UOG_001-AC_TOP-Accelerometer-2017-07-22T112654.csv。下面的代码显示了我计划如何将文件读入openFile函数:

代码语言:javascript
运行
复制
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中使用的关键字的两个字母的列表?例如:

代码语言:javascript
运行
复制
 list = ['AC', 'FO', 'CK', 'OR', 'RS', 'IK']

对于如何在使用或不使用正则表达式的情况下实现此目标,有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2017-08-07 03:45:18

您可以遍历文件树,然后根据文件名的前两个字母,保存需要合并的每对文件。

代码语言:javascript
运行
复制
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)

我没有提供提取字母和合并文件的实现,但从您的问题看,您似乎已经有了该实现。

票数 0
EN

Stack Overflow用户

发布于 2017-08-07 03:45:34

您可以首先进行简单的子字符串检查,然后根据检查结果对文件名进行分组:

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-08-07 06:55:10

下面是来自pathlibPath对象,用于创建名称以“.csv”结尾的文件列表。然后,我使用一个函数来检查每个文件的名称是否存在您使用正则表达式提到的那些字符串中的一个或另一个,这样我就可以创建这些字符串及其关联文件名对的列表。请注意,此对列表的长度为12,并且可以从中恢复文件名。

创建了该列表后,我可以使用itertools中的groupby创建包含两个元素的文件列表,这些文件共享file_kinds列表中的那些字符串。您可以合并这些列表中的项目。

代码语言:javascript
运行
复制
>>> 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中提取完整路径的表达式

代码语言:javascript
运行
复制
[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'])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45535861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档