2009-07-23 19 views
36

पर गलत लाइन टर्मिनेटर उत्पन्न करता है its documentation csv.writer के अनुसार डिफ़ॉल्ट रूप से '\ r \ n' को lineterminator के रूप में उपयोग करना चाहिए।पायथन 2 सीएसवी लेखक विंडोज

import csv 

with open("test.csv", "w") as f: 
    writer = csv.writer(f) 

    rows = [(0,1,2,3,4), 
      (-0,-1,-2,-3,-4), 
      ("a","b","c","d","e"), 
      ("A","B","C","D","E")]   

    print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n") 
    writer.writerows(rows) 
    print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n") 

यह

\r\n 
\r\n 

प्रिंट अपेक्षा के अनुरूप। लेकिन, बनाया सीएसवी फ़ाइल lineterminator का उपयोग करता है '\ r \ r \ n'

0,1,2,3,4 

0,-1,-2,-3,-4 

a,b,c,d,e 

A,B,C,D,E 

यह एक बग है या कुछ csv.writer की मेरी उपयोग में गलत क्या है?

अजगर संस्करण:

ActivePython 2.6.2.2 (ActiveState Software Inc.) अजगर 2.6.2 (r262: 71,600, अप्रैल 21, 2009, 15:05:37) के आधार पर [एमएससी v 0.1500 32 बिट (इंटेल)] Win32

पर Windows Vista पर

+0

मैं आपकी समस्या का पुन: उत्पन्न नहीं कर सकता: $ file test.csv test.csv: सीएसएलएफ लाइन टर्मिनेटर –

+1

@lutz: $ प्रॉम्प्ट का मतलब है * एक्स जिसका मतलब है कि टेक्स्ट के बीच कोई अंतर नहीं है (पायथन 2.x में) मोड और बाइनरी मोड; ओपी विंडोज चल रहा है। –

+2

@wierob: .replace (...) को प्रतिस्थापित करें। (...), प्रतिस्थापित करें (...), अंतर्निहित repr() –

उत्तर

60

पायथन 2.x में, हमेशा अपनी फ़ाइल द्विआधारी मोड में, के रूप में दस्तावेज खोलने । csv\r\n लिखते हैं के रूप में आप की उम्मीद है, लेकिन फिर अंतर्निहित में Windows पाठ फ़ाइल तंत्र कटौती और परिवर्तन \n\r\n ... कुल प्रभाव है कि: \r\r\n

csv.writer प्रलेखन से:

तो csvfile है एक फ़ाइल ऑब्जेक्ट, इसे प्लेटफॉर्म पर 'b' ध्वज के साथ खोला जाना चाहिए जहां इससे कोई फर्क पड़ता है।

वास्तव :-)

+0

काम करने के लिए लगता है। क्या आप मुझे बता सकते हैं कि यह कहां दस्तावेज है? – wierob

+6

एक अच्छी "फीचर" यह है कि कोई भी प्लेटफॉर्म पर बाइनरी मोड में अभी भी खुल सकता है जहां इससे कोई फर्क नहीं पड़ता - उदाहरण के लिए, लिनक्स, इसलिए हमेशा बाइनरी मोड का उपयोग करें। – Arafangion

+2

3 के रूप में।6, दस्तावेज़ अब कहते हैं, 'यदि csvfile एक फ़ाइल ऑब्जेक्ट है, तो इसे newline =' ' – jebob

15

दुर्भाग्य मुख्य अपराधी के नाम के बारे में कुछ बोले चुप्पी प्रतीत हो रहा है, यह अजगर 3 के लिए सीएसवी मॉड्यूल के साथ थोड़ी अलग है, लेकिन इस कोड को दोनों अजगर पर काम करेंगे 2 और अजगर 3:

if sys.version_info >= (3,0,0): 
    f = open(filename, 'w', newline='') 
else: 
    f = open(filename, 'wb') 
+0

मेरा मानना ​​है कि यह है एकमात्र समाधान जो विंडोज और लिनक्स दोनों पाइथन 2 और 3 दोनों पर काम करता है, और प्लेटफॉर्म पर ध्यान दिए बिना '\ r \ n' के CSV मानक का पालन करने वाली फ़ाइलों को उत्पन्न करता है। – MestreLion

19

अजगर 2.7 सीएसवी लेखक उपयोग में लाइन टर्मिनेटर को बदलने के लिए

writer = csv.writer(f, delimiter = '|', lineterminator='\n')

\ r \ n से डिफ़ॉल्ट डिलीमीटर बदलने के लिए यह एक बहुत ही आसान तरीका है।

+0

यह 3.4 में भी मेरे साथ काम करता है – Terrabits

+0

यह काम करता है और आसान है !! मैं डिक्टवाइटर का उपयोग stdout --- का उपयोग कर रहा हूं --- इसलिए उपरोक्त समाधान वास्तव में उपयुक्त नहीं हैं या अतिरिक्त ओवरहेड जोड़ रहे हैं। – ripvlan

+0

संबंधित: https://stackoverflow.com/a/39379062/95852 –

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