2015-11-20 23 views
-2

簡介

給出一個包含與模式前綴Yea​​r.csv命名的CSV文件的目錄,創建一組新的CSV文件,命名爲前綴aggregate.csv每個集成文件是組合所有具有相同前綴的CSV文件。類似名稱的蟒蛇合併的CSV

說明

我有一個包含5,500這種模式命名CSV文件的目錄:前綴Yea​​r.csv。例如:

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

我想組,結合了常用前綴的文件到名爲前綴aggregate.csv文件。

+0

@ lego-stormtroopr:我的答案是完整的,只有47行。另外,儘管各向異性可以更好地解決問題,但他非常清楚自己想要完成的任務:'給定一個包含以Prefix-Year.csv模式命名的CSV文件的目錄,創建一組名爲Prefix-aggregate的CSV文件。 csv其中每個聚合文件是具有相同前綴的所有CSV文件的組合。 – Harvey

+0

@mariano:管理員是否會自動收到有關他們標記/暫停/等問題的評論的通知? – Harvey

+0

@ rajesh-jadav:上面的「幫助中心」鏈接表示如果原始海報進行編輯,問題將被放入審閱隊列中。 – Harvey

回答

0

解決你的問題是下面的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) 
+1

謝謝!這做了我想要的,只需要改變打開參數是字符串而不是字節。 – Anisotropic

0

如何:

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)