2015-05-19 87 views
7

Python ile yeni başlayan biriyim. Birden fazla CSV dosyam var (10'dan fazla) ve hepsinin aynı sayıda sütun var. Tüm bunları, üstbilgileri tekrar etmeyeceğim tek bir CSV dosyasına birleştirmek istiyorum.Başlıklar tekrarlanmadan çoklu CSV dosyalarını birleştirme (Python kullanarak)

Temel olarak, tüm üstbilgileri olan ilk satırı kullanmam gerekiyor ve bundan sonra birleştirilen tüm CSV dosyalarındaki tüm satırlara ihtiyacım var. Bunu nasıl yaparım?

Herhangi bir yardım için teşekkür ederiz.

Teşekkürler!

+0

Ben bugüne kadar ne çalıştığımız güncelledik. @MarcB –

+1

öyleyse sorun nedir? İlk dosyanın başlık satırını korumanın dışında çalışması gerektiği gibi görünüyor. –

+0

csv.reader satırında girinti (fin, sınırlayıcı = ','): yanlış görünüyor. – russdot

cevap

16

, hiç csv modülünü kullanmadan yapabilirsiniz:

import glob 

interesting_files = glob.glob("*.csv") 

header_saved = False 
with open('output.csv','wb') as fout: 
    for filename in interesting_files: 
     with open(filename) as fin: 
      header = next(fin) 
      if not header_saved: 
       fout.write(header) 
       header_saved = True 
      for line in fin: 
       fout.write(line) 
+0

@ m.wasowski Bu işe yaradı, ama sadece yaptığı tek şey dosyaları birleştirmektir. Başlıklar bile birleştirilir. Aynı başlıklara sahip 10 CSV dosyam var. Bu nedenle, temel olarak, çıkış dosyasında başlık satırını 10 kez bu koda getiriyorum. Herhangi bir değişiklik önerildi mi? –

+0

Kötüyüm, okuma başlığını 'if' engellemesine taşıdım. sabit sürüme bakınız; @PadraicCunningham diğer fikrin arta kalan, sabit, teşekkürler. –

+0

Mükemmel! İşe yaradı. Çok teşekkürler! –

17

bir Linux sistemi üzerinde ise:

head -1 director/one_file.csv > output csv ## writing the header to the final file 
tail -n +2 director/*.csv >> output.csv ## writing the content of all csv starting with second line into final file 
+3

değil, bir python cevabı istiyorum, ama bu akıllıca hileleri seviyorum. –

+3

Sonuç dosyasına ek metin eklenmesini önlemek için kuyruk komutuna '-q' (--quiet) eklemem gerekiyordu. – ElMesa

1

Kişisel girinti yanlış, sen bloğu ile iç döngü koymak gerekir. Ayrıca dosya nesnesini writer.writerows'a aktarabilirsiniz.

import csv 
with open('output.csv','wb') as fout: 
    wout = csv.writer(fout) 
    interesting_files = glob.glob("*.csv") 
    for filename in interesting_files: 
     print 'Processing',filename 
     with open(filename,'rb') as fin: 
       next(fin) # skip header 
       wout.writerows(fin) 
+0

Burada dikkatli olun, bir saat için bir senaryoda hata ayıkladı çünkü 'glob' dizeleri tamsayılar olarak biçimlendirmeye karar verdim ve dizelerimin bir kısmından sıfır ped bıraktı. – Blairg23

+0

@ Blairg23, glob bir int için herhangi bir şey atmayacaktı bu yüzden bu mümkün olmayacaktı –

+0

Sanırım SublimeText ile ilgili bir sorun vardı, çünkü bugün aynı senaryoyu denedim ve onları yayınlamadım. Önbellekte veya bir şeyde bir değer olmalı. Yorumumu görmezden gel. – Blairg23

6

Ek yükü dikkate almazsanız, ortak python dağıtımlarıyla birlikte gönderilen pandaları kullanabilirsiniz. E-tablo tablolarıyla daha fazlasını yapmayı planlıyorsanız, kendi kitaplıklarınızı yazmaya çalışmak yerine pandaları kullanmanızı öneririm.

import pandas as pd 
import glob 
interesting_files = glob.glob("*.csv") 
df_list = [] 
for filename in sorted(interesting_files): 
    df_list.append(pd.read_csv(filename)) 
full_df = pd.concat(df_list) 

full_df.to_csv('output.csv') 

Sadece biraz daha pandalar. E-tablo benzeri verilerle başa çıkılacağı için ilk satırın bir başlık olduğunu biliyor. Bir CSV'yi okurken, veri tablosunu pandalardaki standart veri türü olan dataframe'un meta verileri olarak tutulan başlıktan ayırır. Bu dataframes'un birçoğuna uyuyorsanız, başlıkları aynıysa sadece veri bölümlerini birleştirir. Başlıklar aynı değilse, başarısız olur ve size bir hata verir. Dizininizin başka bir kaynaktan gelen CSV dosyalarıyla kirlenmesi durumunda muhtemelen iyi bir şey.

Başka bir şey: interesting_files'un çevresine sorted() ekledim. Dosyalarınızın sırayla isimlendirildiğini ve bu siparişin tutulması gerektiğini kabul ediyorum. Küre hakkında emin değilim, ancak os işlevleri, adlarına göre sıralanmış dosyaları döndürmek zorunda değil. Ben en iyi yanıtı @valentin gelen biri olduğunu düşünürken

+0

Bunu denedim, ancak şu hatayı alıyorum: Alma Hatası: Pandas adlı bir modül yok. –

+0

pandalar yüklü değil gibi görünüyor. "Pip install pandas" terminalinde deneyin. Basit bir python yüklemesi kullanıyorsanız, en yaygın paketler ile başlamaya başlamak için anaconda (http://continuum.io/downloads) gibi bir python dağıtımı yüklemekten yararlanabilirsiniz. –

+0

Çok teşekkür ederim! Pandaları deneyeceğim. İşimi daha kolay yapmalı gibi görünüyor. –

İlgili konular