2013-04-16 181 views
0

我将csv文件分散在多个目录中,每个csv文件只有一列包含数据。我想要做的是读取所有这些文件,并将每个文件的列放入csv文件中。最终的csv文件将具有文件名作为其标题的列和来自其原始文件的相应数据作为其列数据。将CSV文件数据合并到一个CSV文件中

这里面~/csv_files/ ls

ab arc bat-smg bn  cdo crh  diq es fo gd haw ia iu ki ksh lez lv mo na  no os pih rmy sah simple ss tet tr ur war zea 
ace arz bcl  bo  ce cs  dsb et fr gl he id ja kk ku lg map-bms mr nah  nov pa pl rn sc sk  st tg ts uz wo zh 
af as 

每个目录有两个CSV文件,我的目录结构,我想用os.walk()函数,但我觉得我的os.walk的理解不正确,这就是为什么目前我所拥有的东西不会产生任何东西。

import sys, os 
import csv 

root_path = os.path.expanduser(
    '~/data/missing_files') 

def combine_csv_files(path): 
    for root, dirs, files in os.walk(path): 
     for dir in dirs: 
      for name in files: 
       if name.endswith(".csv"): 
        csv_path = os.path.expanduser(root_path + name) 
        if os.path.exists(csv_path): 
         try: 
          with open(csv_path, 'rb') as f: 
           t = f.read().splitlines() 
           print t 
         except IOError, e: 
          print e 

def main(): 
    combine_csv_files(root_path) 

if __name__=="__main__": 
    main() 

我的问题是:

  1. 什么我错在这里做什么?
  2. 我可以从另一个文件中读取一个csv列,并将该数据作为列添加到另一个文件中,因为csv文件更依赖于行,这里行之间没有依赖关系。

最后我想获得这样的csv文件,(这里有潜在的头)

ab_csv_data_file1, ab_csv_data_file2, arc_csv_data_file1, arc_csv_data_file2 
+0

加上'打印csv_path'到最里面的'for'循环,以确保路径是你所期望的 – bernie

+1

你滥用os.walk() – Sheng

+3

圣洁嵌套蝙蝠侠。 – squiguy

回答

2

您正确使用os.walk()

def combine_csv_files(path): 
    for root, dirs, files in os.walk(path): 
     for name in files: 
      if name.endswith(".csv"): 
       csv_path = os.path.join(root, name) 
       try: 
        with open(csv_path, 'rb') as f: 
         t = f.read().splitlines() 
         print t 
       except IOError, e: 
        print e 

的os.walk()函数产生一个3元组(dirpath,dirnames,文件名)。 “dirpath”是当前行走目录的路径,“dirnames”是“dirpath”中的目录列表,“filenames”是“dirpath”中的文件列表。 “dirpath”可能是此处的“路径”,以及“路径”的任何子文件夹。

+0

太棒了!谢谢,当我在新文件中写入时,如何获得目录名称的访问权限我想将dirname作为列标题 –

+0

更长的目录名称将是“root”。如果您只想要最后一个目录名称,请使用os.path.basename(root)。很高兴看到我的代码很有用! – Sheng

+0

刚刚更新了这个问题,就最终的csv给出了一个清晰的想法。谢谢, –

1

我不知道我是否理解你的意思。让我们有多个文件夹,比如“ab”,“arc”等等。对于每个文件夹,它包含两个CSV文件。

如果我是对的,那么你没有做正确的事情。

def combine_csv_files(path): 
    for root, dirs, files in os.walk(path): 
     for dir in dirs: 
      for dirpath, sub_dirs, sub_files in os.walk('/'.join([path,dir]) 
       for name in sub_files: 
        if name.endswith(".csv"): 
         csv_path = os.path.expanduser(dirpath + name) 
         if os.path.exists(csv_path): 
          try: 
           with open(csv_path, 'rb') as f: 
            t = f.read().splitlines() 
            print t 
          except IOError, e: 
           print e 

上面的代码应该工作,如果我是正确的

+0

只需更新问题即可获得最终csv的想法 –

+0

个人而言,我认为第二个os.walk是无用的。和OS独立,os.path.join比'/'更好。加入 – Sheng

+0

os.path.join更好,我同意。然而,第二os.walk是必要的。首先os.walk获取所有子目录。当你迭代每个子目录时,你将需要第二个os.walk来找出该子目录下的文件。我的意思是这种方法本身并不是最优的,但我想这个想法是正确的。 –