2016-04-05 39 views
-4

Yapılandırmda tanımlanan konuma bağlı olarak, dikdörtgenin bir listesinden veri ayıklamakta sorun yaşıyorum. Senaryo: Vertica tablosundan bir dict listesi alıyorum (bazı yöntem çağrısı aracılığıyla) ve bu dosyayı dosyaya yazabilmem için dosyadaki verileri (başlık olarak veri içeriği olarak anahtar) yazmam gerekiyor Başka bir amaç için sftp.Python'daki konuma göre dosyaya nasıl veri yazılır

Örnek

# data received in a list of dict 
new_list = [{'Table':'A', 'Column':'C1', 'DataType':'int'}, 
      {'Table':'A', 'Column':'C2', 'DataType':'varchar'}, 
      {'Table': 'B', 'Column': 'C3', 'DataType': 'int'} 
      ] 
My konfigürasyon "Tablo" veri 0 ila 10 arasında başlayacak şekilde tanımlanan

, "kolon", 11 ila 25 başlar ve "Veri türü" 25 ila başlar 35 dosyada. Ayrıca, tanımlanan aralığı doldurmak için yeterli veri yoksa, belirtilen alan uzunluğuna ulaşıncaya kadar verilerden sonra boşluk ile doldurulması gerekir. Bu yüzden aşağıdaki gibi çıktı bekliyorum. Burada liste doğada dinamiktir. Biliyorum, seek()'u kullanmam gerekiyor ama biraz kafam karıştı.

Table   Column     DataType 
A    C1      int 
A    C2      varchar 
B    C3      int 

Herhangi Öneriler?

+0

Verilerinizi bulmak için liste indekslerine güvenmek kırılgan ve savurgan. Listelerden başka bir veri formatı kullanırdım; Sözlüklerin sözlüğü ne olacak? json? Her neyse, eminim soruyu tam olarak anlıyorum. Dosya kodunuz nerede? – jDo

+0

Benim önerim 'struct' modülünü kullanıyor olabilir ama uzun bir cevap olurdu –

+0

Dosyayı w +' modu ile yazmak ve güncellemek için açın. İstenilen konuma ilerlemek için '()' yi arayın, ardından istenen verileri yazmak için 'yaz()' komutunu kullanın. –

cevap

1

:

>>> def f(lst): 
     print('{:<10s}{:<15s}{:<10s}'.format(*['Column','Table','DataType'])) 
     for row in new_list: 
      s = '{d[Column]:<10s}{d[Table]:<15s}{d[DataType]:<10s}'.format(d=row) 
      print(s) 


>>> f(new_list) 
Column Table   DataType 
C1  A    int  
C2  A    varchar 
C3  B    int 
+0

Teşekkürler. veriler doğru biçimlendirilmiş gibi görünüyor. aynı zamanda başlıklar için de aynısını yapması gerekiyor. @Iron Fist – Pradeep

+0

@Pradeep ..Bunu bir uygulama olarak yapabilirsiniz, ancak yine de kod güncellendi. –

+0

@Pradeep ... Bu cevabın sizin için doğru çözümü sağladığını düşünüyorsanız, bunu kabul etmekten çekinmeyin, aksi takdirde, sorununuz hala çözülmediyse, bir güncelleme yaparak sorunuzu * yapın *. –

0

Ben kısmen tahmin ediyorum ama belki bu ne istediğiniz:

new_list = [{'Table':'A', 'Column':'C1', 'DataType':'int'}, 
      {'Table':'A', 'Column':'C2', 'DataType':'varchar'}, 
      {'Table': 'B', 'Column': 'C3', 'DataType': 'int'} 
      ] 
# print in terminal 
print "\t".join(new_list[0].keys()) 
for d in new_list: 
    print "{}\t{}\t{}".format(d["Table"], d["Column"],d["DataType"]) 

# write to file 
with open("outfile", "w") as f: 
    f.write("\t".join(new_list[0].keys()) + "\n") 
    for d in new_list: 
     f.write("{}\t{}\t{}\n".format(d["Table"], d["Column"],d["DataType"])) 

Sonuç: string formatting kullanarak bu istediğini düşünüyorum

$ cat outfile 
Column Table DataType 
A  C1  int 
A  C2  varchar 
B  C3  int 
+0

ancak verilerin nereden başlayacağı ve biteceği konumdan bahsetmediniz. Her başlık için pozisyonları takip etmem gerekiyor, aksi halde başka bir süreç yanlış verileri okuyacaktır. JDo – Pradeep

+0

@Pradeep Öyleyse, yeni_listede d için [0: 9]: '' 'dır, yeni_listede [10:24]:', vb. için derken, sütunlar her zaman 10 dizini ayrıysa, muhtemelen Modül 9 veya 10 – jDo

İlgili konular