Pythonically एक csv फ़ाइल में हेडर जोड़ें


85

मैंने दो सीएसवी फ़ाइलों को विलय करते हुए पायथन स्क्रिप्ट लिखी है, और अब मैं अंतिम सीएसवी में एक हेडर जोड़ना चाहता हूं। मैं निम्नलिखित सुझाव रिपोर्ट करने की कोशिश की यहाँ और मैं निम्नलिखित त्रुटि मिली: expected string, float found। इसे ठीक करने का सबसे पैथोनिक तरीका क्या है?

यहाँ कोड का उपयोग कर रहा हूँ:

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.DictWriter(outcsv, fieldnames = ["Date", "temperature 1", "Temperature 2"])
    writer.writeheader()

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row + [0.0] for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)

आप अपने csv फ़ाइल में कितने कॉलम लिख रहे हैं? क्या आप अपने प्रश्न में निर्दिष्ट कर सकते हैं 1. आपकी फ़ाइल का इनपुट प्रारूप 2. आउटपुट स्वरूप
nio

@nio: कोड का एक बड़ा खंड पोस्ट से है ओ पी द्वारा इस पिछले प्रश्न
मार्टिन पीटर्स

जवाबों:


116

DictWriter()वर्ग की उम्मीद शब्दकोशों प्रत्येक पंक्ति के लिए। यदि आप जो कुछ करना चाहते हैं वह एक प्रारंभिक हेडर लिख रहा था, हेडर के लिए csv.writer()एक सरल पंक्ति में एक नियमित और पास का उपयोग करें :

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.writer(outcsv)
    writer.writerow(["Date", "temperature 1", "Temperature 2"])

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row + [0.0] for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)

आपके डेटा में प्रतिलिपि बनाते समय वैकल्पिक शब्द उत्पन्न करना होगा:

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.DictWriter(outcsv, fieldnames = ["Date", "temperature 1", "Temperature 2"])
    writer.writeheader()

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows({'Date': row[0], 'temperature 1': row[1], 'temperature 2': 0.0} for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows({'Date': row[0], 'temperature 1': 0.0, 'temperature 2': row[1]} for row in reader)

1
बाइनरी मोड में फाइलें क्यों खोली जा रही हैं? सीएसवी फाइलें स्पष्ट रूप से पाठ हैं, न कि बाइनरी प्रारूप। यह विंडोज सिस्टम पर समस्या पैदा कर सकता है।
18

3
@ pcarter: पायथन 2 पर, विंडोज पर टेक्स्ट मोड में एक फाइल खोलना, नए अनुवादों को ट्रिगर करता है जो सीएसआर प्रारूप के साथ असंगत हैं; csvमॉड्यूल इस प्रकार सीधे (का उपयोग कर नई-पंक्तियों को संभालने के लिए चाहता है \nऔर \r\nजरूरत के रूप में), आप द्विआधारी मोड में फ़ाइल खोलने के लिए है जिसका अर्थ है। csv.reader()दस्तावेज़ीकरण देखें : यदि csvfile एक फ़ाइल ऑब्जेक्ट है, तो इसे उन प्लेटफार्मों पर 'b' ध्वज के साथ खोला जाना चाहिए जहां इससे कोई फर्क पड़ता है। । अजगर 3 पर, आप इसके बजाय newline=''विकल्प का उपयोग करेंगे।
मार्टिन पीटर्स

यह काम करता है, मज़ेदार बात: जब फ़ाइल को aमोड में खोला जाता है, writer.writeheader()तो हेडर पहले ही लिखे जाने के बावजूद दो बार हेडर को लिख देगा!
लोरेटोपार्सी

2
@loretoparisi: बेशक यह करता है। writer.writeheader()मौजूदा फ़ाइल में संलग्न करते समय उपयोग न करें । csv.writer()वस्तु का पता नहीं लगा सकते हैं कि आप किसी मौजूदा फ़ाइल के लिए डेटा लिख रहे हैं।
मार्टिन पीटर्स

पायथन 3 में, 'w' विकल्प के साथ फाइल खोलने की जरूरत है, बाइनरी काम नहीं करेगी। उत्तर में इसका उल्लेख करना उपयोगी होगा। मुझे यह अंतर यहाँ मिला: stackoverflow.com/questions/34283178/…
Kristóf

6

लूप निष्पादित करने से पहले आप सिर्फ एक अतिरिक्त पंक्ति जोड़ते हैं। इस पंक्ति में आपका CSV फ़ाइल हेडर नाम है।

schema = ['a','b','c','b']
row = 4
generators = ['A','B','C','D']
with open('test.csv','wb') as csvfile:    
     writer = csv.writer(csvfile, delimiter=delimiter)
# Gives the header name row into csv
     writer.writerow([g for g in schema])   
#Data add in csv file       
     for x in xrange(rows):
         writer.writerow([g() for g in generators])

3

इसने मेरे लिए काम किया।

header = ['row1', 'row2', 'row3']
some_list = [1, 2, 3]
with open('test.csv', 'wt', newline ='') as file:
    writer = csv.writer(file, delimiter=',')
    writer.writerow(i for i in header)
    for j in some_list:
        writer.writerow(j)

1
एक चर के रूप में फ़ाइल का उपयोग करना एक अच्छा विचार नहीं है। पंक्ति # 3। इसके बजाय csvfile या कुछ अन्य का उपयोग करें।
गोरगोन्जोला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.