python 2 या python 3 में csv फाइल लिखने का पोर्टेबल तरीका




python-3.x python-2.7 (2)

विंडोज पर, मुझे एक lineterminator 2 और 3 lineterminator करने का तरीका मिला, इसे बदलकर csv lineterminator विकल्प (जो कि "\r\n" लिए डिफॉल्ट करता है, जो विंडोज़ में टेक्स्ट मोड में फाइल के खुलने पर एक \r बहुत अधिक बनाता है)

import csv

with open("out.csv","w") as f:
    cr = csv.writer(f,delimiter=";",lineterminator="\n")
    cr.writerow(["a","b","c"])
    cr.writerow(["d","e","f"])
    cr.writerow(["a","b","c"])
    cr.writerow(["d","e","f"])

जो भी अजगर संस्करण है, जो कुख्यात "रिक्त लाइनों" के बिना एक सीएसवी फ़ाइल बनाएगा।

एकमात्र दोष यह है कि लिनक्स पर, यह विधि \r -free फ़ाइलों का उत्पादन करेगी, जो शायद मानक नहीं है (हालांकि फाइलें अभी भी एक्सेल में ठीक से खुलती हैं, कोई खाली लाइनें और अभी भी कई लाइनें :))

समस्या ३.६.२ पर बनी हुई है (जैसे मैंने खुद को जाँच लिया कि मुझे कुछ समय पहले होना चाहिए)

https://code.i-harness.com

अपने विंडोज बॉक्स पर, मैंने आमतौर पर एक csv फ़ाइल लिखने के लिए अजगर 2 में ऐसा किया:

import csv
f = open("out.csv","wb")
cr = csv.writer(f,delimiter=';')
cr.writerow(["a","b","c"])
f.close()

अब जब कि अजगर 3 पाठ फ़ाइलों को द्विआधारी के रूप में लिखने से मना करता है, तो कोड का टुकड़ा अब काम नहीं करता है। यह काम करता है:

import csv
f = open("out.csv","w",newline='')
cr = csv.writer(f,delimiter=';')
cr.writerow(["a","b","c"])
f.close()

समस्या यह है: newline पैरामीटर पायथन 2 के लिए अज्ञात है।

बेशक, एक csv फ़ाइल में बहुत से \r वर्णों के साथ नईलाइन परिणाम को छोड़ देना, इसलिए स्वीकार्य नहीं है।

मैं वर्तमान में अजगर 2 से अजगर 3.5 तक उत्तरोत्तर प्रवास करने के लिए एक पश्चगामी संगत प्रक्रिया का प्रदर्शन कर रहा हूं। मेरे सभी मॉड्यूल में बहुत सारे कथन हैं।

मेरा समाधान कस्टम मॉड्यूल में कोड को एम्बेड कर रहा था, और कस्टम मॉड्यूल हैंडलर + लेखक ऑब्जेक्ट को रिटर्न करता है। एक अजगर संस्करण की जाँच मॉड्यूल के अंदर की जाती है, जो मेरे मॉड्यूल का उपयोग करके किसी भी मॉड्यूल को बहुत अधिक हैकिंग के बिना अजगर संस्करण जो भी काम करने की अनुमति देता है।

क्या कोई बेहतर तरीका है?


सीएसवी फ़ाइलों को पढ़ने और लिखने दोनों के लिए, मुझे कोई बेहतर तरीका नहीं मिला है - हालांकि मैं नीचे दिखाए गए अनुसार एक अलग फ़ंक्शन में संलग्न करूंगा। फायदा यह हो रहा है कि एक बार से ज्यादा जरूरत पड़ने पर तर्क को नकल के बजाय सभी एक जगह पर रखा जाता है।

import csv
import sys

def open_csv(filename, mode='r'):
    """Open a csv file in proper mode depending on Python verion."""
    return(open(filename, mode=mode+'b') if sys.version_info[0] == 2 else
           open(filename, mode=mode, newline=''))

with open_csv('out.csv', 'w') as f:
    writer = csv.writer(f, delimiter=';')
    writer.writerow([1, 2, 3])
    writer.writerow(['a', 'b', 'c'])





carriage-return