पायथन का dict
एस 3.6 से पहले आदेश बनाए रखता है।
हालांकि, यह है कि आप प्रयोग कर रहे हैं (के बाद आप पहली पंक्ति पढ़ा है! -) csv.DictReader
के कहने करता स्ट्रिंग की एक .fieldnames
सूची है, जो क्रम में है।
तो,
for rowdict in myReader:
print ['%s:%s' % (f, rowdict[f]) for f in myReader.fieldnames]
तुम्हें दिखाता है कि आदेश वास्तव में बनाए रखा है (बेशक .fieldnames
में, कभीdict
में - कि अजगर में आंतरिक रूप से असंभव है -!)।
तो, मान लें कि आप a.csv
पढ़ना चाहते हैं और उसी कॉलम ऑर्डर के साथ b.csv
लिखना चाहते हैं। सादा पाठक और लेखक का उपयोग करना बहुत आसान है, इसलिए आप इसके बजाय डिक्ट किस्मों का उपयोग करना चाहते हैं ;-)। यह मानते हुए कि आप a.csv
में हेडर है (otherewise आप उस पर एक DictReader उपयोग नहीं कर सकते) और b.csv
में सिर्फ एक ही हेडर चाहते
import csv
a = open('a.csv', 'r')
b = open('b.csv', 'w')
ra = csv.DictReader(a)
wb = csv.DictWriter(b, None)
for d in ra:
if wb.fieldnames is None:
# initialize and write b's headers
dh = dict((h, h) for h in ra.fieldnames)
wb.fieldnames = ra.fieldnames
wb.writerow(dh)
wb.writerow(d)
b.close()
a.close()
: ठीक है, एक ही रास्ता है ...।
स्रोत
2009-12-11 01:50:46
धन्यवाद एलेक्स मार्टेलि! आप यहां कर्तव्य की कॉल के ऊपर और ऊपर चले गए हैं :) और ... इसकी सराहना की जाती है! मुझे एहसास नहीं हुआ कि फील्डनाम थे, लेकिन एपीआई दस्तावेज़ों को दोबारा पढ़ना मैं अब इसे देख सकता हूं। विकल्प के लिए धन्यवाद, लेकिन चूंकि मेरा डिक्ट्रेडर अब अच्छी तरह से काम कर रहा है, इसलिए मैं इसके साथ रहूंगा। – Alex
@RaffiKhatchadourian a a.csv है, b है b.csv ra संभवतया फ़ाइल ए से पढ़ने के लिए खड़ा है, संभवतया फ़ाइल बी, डी के लिए डी, शब्दकोश के लिए डीएच, शब्दकोश हेडर के लिए डीएच .... एलेक्स भयानक स्पष्टीकरण के लिए धन्यवाद ! – Deep
किसी भी कारण से आप पूरे 'dh = dict (...' '... wb.writerow (dh) 'के माध्यम से गए थे, जब आप' wb.fieldnames = ra.fieldnames; wb.writeheader()' कर सकते थे? – Baldrickk