पाइथन में CSV एक अतिरिक्त गाड़ी वापसी, विंडोज पर


231
import csv
outfile = file('test.csv', 'w')
writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['hi','dude'])
writer.writerow(['hi2','dude2'])
outfile.close()

यह प्रत्येक पंक्ति में test.csvअतिरिक्त के साथ , एक फ़ाइल बनाता है \r, जैसे:

test.csv

hi,dude\r\r\nhi2,dude2\r\r\n

अपेक्षित के बजाय:

hi,dude\r\nhi2,dude2\r\n

ऐसा क्यों हो रहा है, या यह वास्तव में वांछित व्यवहार है?

ध्यान दें:

  • यह व्यवहार पायथन 2 या 3 के साथ हो सकता है।

जवाबों:


311

अजगर 3:

  • जैसा कि YiboYang द्वारा वर्णित है , सेट करेंnewline=''
with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    ...
  • जैसा कि CoDEmanX द्वारा टिप्पणियों में उल्लेख किया गया है , सेट करेंnewline='\n'
with open('output.csv', 'w', newline='\n', encoding='utf-8') as f:
    writer = csv.writer(f)
    ...

अजगर 2:

विंडोज़ पर, हमेशा अपनी फ़ाइलों को बाइनरी मोड ( "rb"या "wb") में खोलें , csv.readerया उन्हें पास करने से पहले csv.writer

हालाँकि फ़ाइल एक पाठ फ़ाइल है, लेकिन CSV को अलग-अलग रिकॉर्ड्स के साथ शामिल पुस्तकालयों द्वारा एक द्विआधारी प्रारूप माना जाता है \r\n। यदि वह विभाजक पाठ मोड में लिखा गया है, तो पायथन रनटाइम के \nसाथ बदल जाता है \r\n, इसलिए \r\r\nफ़ाइल में देखा गया है।

इसका पिछला उत्तर देखें ।


3
यह ASCII के लिए ठीक है, लेकिन UTF-8 की तरह एन्कोडिंग को मार देगा। नीचे जेसन के समाधान ने मेरे लिए काम किया।
टॉम

66
पायथन 3 में, मैं फ़ाइल ऑब्जेक्ट के लिए निम्न विकल्पों का उपयोग करके इसे ठीक करने में सक्षम था open(..., "w", newline="\n", encoding="utf-8"):। newlineएक रिक्त स्ट्रिंग भी हो सकती है, वही परिणाम। "wb"पायथन 3 में काम नहीं करता है, स्ट्रिंग्स और बफर इंटरफ़ेस असंगत हैं।
कोडमेनएक्स

अतिरिक्त गाड़ी वापसी से निपटने का सुरुचिपूर्ण तरीका
फॉरएवर लर्नर

2
Python2 में काम नहीं करता है, इसलिए यदि आपको 2 और 3 दोनों के साथ संगत होने की आवश्यकता है, तो @ jason-r-coombs द्वारा दिए गए उत्तर का उपयोग करें:writer = csv.writer(f, lineterminator='\n')
yossiz74

4
यह एक वास्तविक शर्म की बात है कि इस तरह के एक, बुनियादी आम और सरल एपीआई काम के रूप में की आवश्यकता नहीं करता है
SomethingSomething

248

जबकि @ जॉन-माचिन एक अच्छा जवाब देता है, यह हमेशा सबसे अच्छा तरीका नहीं है। उदाहरण के लिए, यह पायथन 3 पर काम नहीं करता है जब तक कि आप अपने सभी इनपुट को सीएसवी लेखक को एनकोड नहीं करते हैं। इसके अलावा, यदि स्क्रिप्ट sys.stdout को स्ट्रीम के रूप में उपयोग करना चाहता है, तो यह समस्या को संबोधित नहीं करता है।

मैं लेखक को बनाते समय 'लाइनमेटेरिनेटर' विशेषता को सेट करने के बजाय सुझाव देता हूं:

import csv
import sys

doc = csv.writer(sys.stdout, lineterminator='\n')
doc.writerow('abc')
doc.writerow(range(3))

यह उदाहरण पायथन 2 और पायथन 3 पर काम करेगा और अवांछित न्यूलाइन वर्णों का निर्माण नहीं करेगा। ध्यान दें, हालांकि, यह अवांछनीय नईलाइन्स (यूनिक्स ऑपरेटिंग सिस्टम पर एलएफ चरित्र को छोड़ना) का उत्पादन कर सकता है।

ज्यादातर मामलों में, हालांकि, मेरा मानना ​​है कि सभी सीएसवी को एक द्विआधारी प्रारूप के रूप में व्यवहार करने की तुलना में व्यवहार बेहतर और स्वाभाविक है। मैं इस जवाब को आपके विचार के लिए एक विकल्प के रूप में प्रदान करता हूं।


6
मेरी राय में यह सबसे अच्छा जवाब है। जैसा कि यूनिक्स में समस्याग्रस्त है, कैसे sys.platform को कॉल करने और गतिशील रूप से निपटने के बारे में?
sovemp

4
मेरी राय में भी सबसे अच्छा जवाब है, और lineterminator = '\ n' खूबसूरती से काम करता है।
इकोनो

1
क्या आप उस समस्या का उदाहरण दे सकते हैं जो यदि आप "अपने सभी इनपुट को सीएसवी लेखक को एनकोड नहीं करते हैं"?
स्टीफन

सावधान: इस साधन \rका उपयोग करने से अब बच नहीं जाता है! ऐसा लगता है कि यह बग है csvwriter, लेकिन जैसा कि यह खड़ा है, गैर-अनुरूप सीएसवी का आउटपुट का मतलब है कि यह जाने का तरीका नहीं है।
flow2k

इसने ^Mमेरे लिए समस्या को हल कर दिया जबकि स्वीकृत उत्तर के 2 सुझावों ने काम नहीं किया।
user985366

55

पायथन 3 में (मैंने पायथन 2 में यह कोशिश नहीं की है), आप बस भी कर सकते हैं

with open('output.csv','w',newline='') as f:
    writer=csv.writer(f)
    writer.writerow(mystuff)
    ...

प्रलेखन के अनुसार ।

डॉक्स के फुटनोट में इस पर और अधिक :

यदि newline = '' निर्दिष्ट नहीं किया गया है, तो उद्धृत फ़ील्ड्स के अंदर एम्बेड किए गए newlines को सही ढंग से व्याख्या नहीं किया जाएगा, और उन प्लेटफ़ॉर्मों पर जो एक अतिरिक्त \ r लिखने पर \ n \ n लाइनिंग का उपयोग करते हैं, को जोड़ा जाएगा। यह हमेशा newline = '' को निर्दिष्ट करने के लिए सुरक्षित होना चाहिए, क्योंकि csv मॉड्यूल अपनी स्वयं की (सार्वभौमिक) न्यूलाइन हैंडलिंग करता है।


2
@ Yibo- यांग, आपने मुझे बहुत समय बचाया।
1

4
महान। मैंने अजगर 3.5 में इस तरह की पुष्टि की
जेफ़

यह डिफ़ॉल्ट व्यवहार क्यों नहीं होगा?
मार्क स्ट्रोब

6

आप csv राइटर कमांड में लाइनमेटेरिनेटर = '\ n' पैरामीटर लगा सकते हैं।

import csv
delimiter='\t'
with open('tmp.csv', '+w', encoding='utf-8') as stream:
    writer = csv.writer(stream, delimiter=delimiter, quoting=csv.QUOTE_NONE, quotechar='',  lineterminator='\n')
    writer.writerow(['A1' , 'B1', 'C1'])
    writer.writerow(['A2' , 'B2', 'C2'])
    writer.writerow(['A3' , 'B3', 'C3'])

1
पायथन 3.5.2 के साथ, यह केवल एक चीज थी जो मेरे लिए काम करती थी (ठीक है, मैंने बस इस्तेमाल किया था lineterminator='\n'); सीएसवी मॉड्यूल की उत्पत्ति प्रतीत हुई \r\n। तर्कों का openकोई प्रभाव नहीं पड़ा।
टॉमी


3

आपको इस तरह के कार्य को खोलने के लिए विशेषता newline = "\ n" जोड़ना होगा:

with open('file.csv','w',newline="\n") as out:
    csv_out = csv.writer(out, delimiter =';')

2

ध्यान दें कि यदि आप DictWriter का उपयोग करते हैं, तो आपके पास खुले फ़ंक्शन से एक नई लाइन और राइटर फ़ंक्शन से एक नई लाइन होगी। आप अतिरिक्त फ़ंक्शन को निकालने के लिए खुले फ़ंक्शन के भीतर newline = '' का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.