2011-04-12 21 views
7

में स्थान सीमवी आउटपुट लिखना मैं पाइथन के सीएसवी लेखक का उपयोग कर एक निश्चित चौड़ाई, स्थान सीमित और न्यूनतम उद्धृत सीएसवी फ़ाइल लिखना चाहता हूं। उत्पादन का एक उदाहरण:निश्चित चौड़ाई लिखना, पाइथन

item1   item2 
"next item1" "next item2" 
anotheritem1 anotheritem2 

अगर मैं का उपयोग

writer.writerow (("{0: 15s}"।: प्रारूप "{15s 0}"। प्रारूप (ITEM1), (ITEM2)))
...

तो, अंतरिक्ष सीमांकक के साथ, स्वरूपण या तो उद्धरण या पलायन (csv.QUOTE_ पर निर्भर करता है * निरंतर) के पीछे वाले स्पेस की वजह से जोड़ रहे हैं के रूप में टूट गया है आइटम स्वरूपण:

"item1   " "item2   " 
"next item1  " "next item2  " 
"anotheritem1 " "anotheritem2 " 
बेशक

, मैं सब कुछ अपने आप को स्वरूपित कर सकते हैं:

writer.writerow ((। "{0: 15s} {1: 15s}" प्रारूप (ITEM1, ITEM2)))

लेकिन फिर सीएसवी लेखक का उपयोग करने में बहुत कुछ नहीं है। साथ ही, जब आइटम आइटम में एम्बेडेड होता है और उद्धरण/भागने का उपयोग किया जाना चाहिए, तो मुझे मैन्युअल रूप से उन मामलों को हल करना होगा। दूसरे शब्दों में, ऐसा लगता है कि मुझे एक (गैर-मौजूदा) "QUOTE_ABSOLUTELYMINIMAL" सीएसवी स्थिरांक की आवश्यकता होगी जो "QUOTE_MINIMAL" के रूप में कार्य करेगी लेकिन पीछे की जगहों को अनदेखा कर देगी।

क्या "QUOTE_ABSOLUTELYMINIMAL" व्यवहार या एक निश्चित चौड़ाई पाने के लिए कोई तरीका है, पाइथन के सीएसवी मॉड्यूल का उपयोग कर अंतरिक्ष सीमित सीएसवी आउटपुट?

कारण मैं एक CSV फ़ाइल में निश्चित चौड़ाई सुविधा चाहता हूं एक बेहतर पठनीयता है। तो इसे पढ़ने और लिखने दोनों के लिए सीएसवी के रूप में संसाधित किया जाएगा लेकिन स्तंभ संरचना के कारण बेहतर पठनीय। पढ़ना कोई समस्या नहीं है क्योंकि सीएसवी skipinitialspace विकल्प अतिरिक्त रिक्त स्थान को अनदेखा करने का ख्याल रखता है। मेरे आश्चर्य के लिए, लेखन एक समस्या प्रतीत होता है ...

संपादित करें: मैंने निष्कर्ष निकाला है कि वर्तमान सीएसवी प्लगइन के साथ हासिल करना असंभव है। यह एक अंतर्निहित विकल्प नहीं है और मुझे मैन्युअल रूप से इसे प्राप्त करने का कोई उचित तरीका नहीं दिख रहा है क्योंकि ऐसा लगता है कि पाइथन के सीएसवी लेखक द्वारा उद्धृत या भागने के बिना अतिरिक्त डिलीमीटर लिखने का कोई तरीका नहीं है। इस प्रकार, मुझे शायद अपना स्वयं का सीएसवी लेखक लिखना होगा।

उत्तर

0

यह सक्रिय राज्य नुस्खा दिखाता है कि अजगर में उत्पादन टेबल ized आंकड़ों के: http://code.activestate.com/recipes/267662-table-indentation/

आपको लगता है कि उदाहरण से पर्याप्त बटोरने के लिए आप क्या चाहते हैं ऐसा करने में सक्षम हो सकता है।

+0

आपके उत्तर के लिए धन्यवाद। हालांकि, आपके द्वारा लिंक किया गया कोड पाइथन की सीएसवी प्लगइन का उपयोग नहीं करता है और सीएसवी आउटपुट के लिए नहीं है। मेरे स्वयं के सीएसवी लेखक को लिखना निश्चित रूप से संभव है लेकिन मुझे उम्मीद थी कि इस उद्देश्य के लिए पाइथन के उपयोग का एक तरीका है ... – jvm

2

यह आपके लिए क्या करता है? मुझे लगता है कि आप वास्तव में केवल csv.QUOTE_NONE निरंतर गायब थे।

import csv 
csv.register_dialect('spacedelimitedfixedwidth', delimiter=' ', quoting=csv.QUOTE_NONE) 
with open('crappymainframe.out', 'rb') as f: 
    reader = csv.reader(f, 'spacedelimitedfixedwidth') 

यह सीएसवी मॉड्यूल दस्तावेज़ों के नीचे यूनिक्सपॉइड बोली उदाहरण पर एक संशोधन है।

+1

मैं नहीं देख सकता कि यह पाठक उदाहरण लेखक की समस्या को कैसे हल कर सकता है? csv.QUOTE_NONE या तो मदद नहीं करता है - आइटम के पीछे की जगहें इस तरह के मामले में लिखने से बच निकलती हैं। – jvm

8

मूल समस्या जो आप चल रहे हैं वह यह है कि सीएसवी और निश्चित प्रारूप मूल रूप से डेटा संग्रहण के विचारों का विरोध कर रहे हैं। उन्हें एक साथ काम करना एक आम प्रथा नहीं है।इसके अलावा, अगर आप केवल उन में रिक्त स्थान के साथ आइटम पर उद्धरण है, यह बंद संरेखण उन पंक्तियों पर फेंक देगा:

testing  "rather hmm " 
strange  "ways to " 
"store some " "csv data " 
testing  testing  

कि डेटा वापस पढ़ना गलत परिणामों में परिणामों में ठीक से:

'testing' 'rather hmm ' 
'strange' 'ways to ' 
'store some ' 'csv data ' 
'testing' 'testing' '' 

अंतिम पंक्ति के अंत में अतिरिक्त फ़ील्ड पर ध्यान दें। इन समस्याओं को देखते हुए, मैं

"item1   " "item2   " 
"next item1  " "next item2  " 
"anotheritem1 " "anotheritem2 " 

जो मैं बहुत पठनीय को खोजने के अपने उदाहरण के साथ जाना होगा, मौजूदा सीएसवी पुस्तकालय के साथ उत्पन्न करने के लिए आसान है, और सही ढंग से जब में वापस पढ़ें पार्स हो जाता है। यहाँ कोड मैं उत्पन्न करने के लिए प्रयोग किया जाता है यह:

import csv 

class SpaceCsv(csv.Dialect): 
    "csv format for exporting tables" 
    delimiter = None 
    doublequote = True 
    escapechar = None 
    lineterminator = '\n' 
    quotechar = '"' 
    skipinitialspace = True 
    quoting = csv.QUOTE_MINIMAL 
csv.register_dialect('space', SpaceCsv) 

data = (
     ('testing ', 'rather hmm '), 
     ('strange ', 'ways to '), 
     ('store some ', 'csv data '), 
     ('testing ', 'testing '), 

temp = open(r'c:\tmp\fixed.csv', 'w') 
writer = csv.writer(temp, dialect='space') 
for row in data: 
    writer.writerow(row) 
temp.close() 

आप, ज़ाहिर है, अपने सभी डेटा एक ही लंबाई के लिए गद्देदार की आवश्यकता होगी, या तो समारोह है कि यह सब करता है, या समारोह अपने आप में प्रवेश करने से पहले। ओह, और यदि आपके पास संख्यात्मक डेटा है तो आपको इसके लिए पैडिंग भत्ते भी बनाना होगा।

संबंधित मुद्दे