【问题标题】:Merging CSVs with similar name python [closed]合并具有相似名称python的CSV [关闭]
【发布时间】:2016-02-22 09:57:10
【问题描述】:

概要

给定一个包含以 Prefix-Year.csv 模式命名的 CSV 文件的目录,创建一组名为 Prefix-aggregate.csv 的新 CSV 文件,其中每个聚合文件是具有相同前缀的所有 CSV 文件的组合。

说明

我有一个包含 5,500 个 CSV 文件的目录,以这种模式命名:Prefix-Year.csv。示例:

18394-1999.csv
   . . .       //consecutive years
18394-2014.csv
18395-1999.csv //next location

我想将带有常用前缀的文件分组并合并到名为 Prefix-aggregate.csv 的文件中。

【问题讨论】:

  • @lego-stormtroopr:我的回答很完整,只有 47 行。此外,虽然各向异性可以更好地表述这个问题,但他想要完成的任务非常明确:'给定一个包含以 Prefix-Year.csv 模式命名的 CSV 文件的目录,创建一组名为 Prefix-aggregate 的新 CSV 文件。 csv 其中每个聚合文件是所有具有相同前缀的 CSV 文件的组合。
  • @mariano:版主是否会自动收到有关 cmets 标记/搁置/等问题的通知?
  • @rajesh-jadav:上面的help center 链接表示,如果由原始发布者编辑,问题将被放入审核队列。
  • @logan-wayne: ...但它并没有说明 cmets...
  • @havenodisplayname: ... 或者其他用户的编辑是否会触发评论。

标签: python regex csv pandas data-cleaning


【解决方案1】:

这个怎么样:

import os
import pandas as pd

root, dirs, files = next(os.walk('data_dir'))

with open('18394_aggregate.csv', 'a') as outfile:
    for infile in files:
        if infile.startswith('18394') and infile.endswith('.csv'):
            df = pd.read_csv(os.path.join(root, infile), header=False)
            df.to_csv(outfile, index=False, header=False)

【讨论】:

    【解决方案2】:

    您的问题的解决方案是下面的find_filesets() 方法。我还包含了一个基于 MaxNoe's answer 的 CSV 合并方法。

    #!/usr/bin/env python
    
    import glob
    import random
    import os
    import pandas
    
    def rm_minus_rf(dirname):
        for r,d,f in os.walk(dirname):
            for files in f:
                os.remove(os.path.join(r, files))
            os.removedirs(r)
    
    def create_testfiles(path):
        rm_minus_rf(path)
        os.mkdir(path)
    
        random.seed()
        for i in range(10):
            n = random.randint(10000,99999)
            for j in range(random.randint(0,20)):
                # year may repeat, doesn't matter
                year = 2015 - random.randint(0,20)
                with open("{}/{}-{}.csv".format(path, n, year), "w"):
                    pass
    
    def find_filesets(path="."):
        csv_files = {}
        for name in glob.glob("{}/*-*.csv".format(path)):
            # there's almost certainly a better way to do this
            key = os.path.splitext(os.path.basename(name))[0].split('-')[0]
            csv_files.setdefault(key, []).append(name)
    
        for key,filelist in csv_files.items(): 
            print key, filelist
            # do something with filelist
            create_merged_csv(key, filelist)
    
    def create_merged_csv(key, filelist):
        with open('{}-aggregate.csv'.format(key), 'w+b') as outfile:
            for filename in filelist:
                df = pandas.read_csv(filename, header=False)
                df.to_csv(outfile, index=False, header=False)
    
    TEST_DIR_NAME="testfiles"
    create_testfiles(TEST_DIR_NAME)
    find_filesets(TEST_DIR_NAME)
    

    【讨论】:

    • 谢谢!这就是我想要的,只需将 open 参数更改为字符串而不是字节。
    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 2022-09-30
    • 2021-09-24
    • 2013-10-10
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多