পাইথন-এ সিএসভি উইন্ডোজ-এ একটি অতিরিক্ত ক্যারিজ রিটার্ন যুক্ত করে


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:

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:

Windows এ, সবসময় বাইনারি মোড (আপনার ফাইল খুলতে "rb"বা "wb"তাদের ক্ষণস্থায়ী আগে), csv.readerবা csv.writer

ফাইলটি একটি পাঠ্য ফাইল হলেও সিএসভি রেকর্ড পৃথক করে জড়িত গ্রন্থাগারগুলি দ্বারা বাইনারি বিন্যাস হিসাবে বিবেচিত হয় \r\n। যে বিভাজক টেক্সট মোড লেখা হয়, তাহলে পাইথন রানটাইম প্রতিস্থাপন \nসঙ্গে \r\n, অত \r\r\nফাইল পরিলক্ষিত।

দেখুন এই পূর্ববর্তী উত্তর


3
এটি ASCII এর জন্য সূক্ষ্ম তবে ইউটিএফ -8 এর মতো এনকোডিংটি মেরে ফেলবে। জেসনের নীচের সমাধানটি আমার পক্ষে কাজ করেছে।
টম

66
পাইথন 3, আমি ফাইল বস্তুর জন্য নিম্নলিখিত অপশন ব্যবহার করে এটি ঠিক করতে সক্ষম ছিল: open(..., "w", newline="\n", encoding="utf-8")newlineএকটি ফাঁকা স্ট্রিংও হতে পারে, একই ফলাফল। "wb"পাইথন 3 এ কাজ করে না, স্ট্রিংগুলি এবং বাফার ইন্টারফেসটি বেমানান।
কোডম্যানএক্স

অতিরিক্ত বাহন ফেরত পরিচালনার দুর্দান্ত উপায়
ForeverLearner

2
পাইথন 2 তে কাজ করে না, সুতরাং আপনার 2 এবং 3 উভয়ের সাথে সামঞ্জস্য করার প্রয়োজন হলে @ জেসন-আর- writer = csv.writer(f, lineterminator='\n')
কোম্বস

4
এটি সত্যিকারের লজ্জাজনক যে এ জাতীয় মৌলিক, সাধারণ এবং সাধারণ এপিআই প্রয়োজনীয় হিসাবে কাজ করে না
সামথিংসমেথিং

248

যদিও @ জন-machin একটি ভাল উত্তর দেয়, এটা সবসময় ভাল পদ্ধতির নয়। উদাহরণস্বরূপ, পাইথন 3 এ কাজ করে না আপনি সিএসভি লেখকের কাছে আপনার সমস্ত ইনপুট এনকোড করে না দিয়ে। এছাড়াও, স্ক্রিপ্টটি sys.stdout প্রবাহ হিসাবে ব্যবহার করতে চাইলে এটি সমস্যাটির সমাধান করে না।

আমি পরিবর্তে লেখক তৈরি করার সময় 'লাইনটারমিনেটর' বৈশিষ্ট্যটি সেট করার পরামর্শ দিচ্ছি:

import csv
import sys

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

উদাহরণটি পাইথন 2 এবং পাইথন 3 এ কাজ করবে এবং অযাচিত নিউলাইন অক্ষর তৈরি করবে না। তবে নোট করুন, এটি অনাকাঙ্ক্ষিত নিউলাইনগুলি তৈরি করতে পারে (ইউনিক্স অপারেটিং সিস্টেমগুলিতে LF অক্ষর বাদ দেওয়া)।

তবে বেশিরভাগ ক্ষেত্রেই আমি বিশ্বাস করি যে সমস্ত সিএসভিকে বাইনারি ফর্ম্যাট হিসাবে বিবেচনা করার চেয়ে আচরণ করা ভাল এবং প্রাকৃতিক। আপনার বিবেচনার বিকল্প হিসাবে আমি এই উত্তরটি সরবরাহ করি।


6
এটি আমার মতে সেরা উত্তর। এটি ইউনিক্সে সমস্যাযুক্ত হিসাবে, কীভাবে সিস.প্ল্যাটফর্মটি কল করা এবং এটি ডায়নামিকভাবে মোকাবেলা করা যায়?
অগস্ট

4
আমার মতেও সেরা উত্তর, এবং লাইনটারমিনেটর = '\ n' সুন্দরভাবে কাজ করে।
একনোন

1
আপনি যদি "CSV লেখকের কাছে আপনার সমস্ত ইনপুটগুলি এনকোড" না করেন তবে সমস্যার উদ্ভবের একটি উদাহরণ দিতে পারেন?
স্টিফেন

সাবধান: এই উপায় ব্যবহার করে \rআর পালানো যায় না! দেখে মনে হচ্ছে এটি ত্রুটিযুক্ত হয়েছে csvwriter, তবে এটি যেমন দাঁড়িয়ে আছে, আউটপুট আউট অব নন-কনফরম্যান্ট সিএসভি মানে এটি যাওয়ার উপায় নয়
ফ্লো

^Mস্বীকৃত উত্তরের 2 টি পরামর্শ কার্যকর না হলেও এটি আমার জন্য সমস্যার সমাধান করেছে ।
user985366

55

পাইথন 3 এ (পাইথন 2 তে আমি এটি চেষ্টা করি নি), আপনি সহজভাবেও করতে পারেন

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

অনুযায়ী ডকুমেন্টেশন

এই বিষয়ে ডকের পাদটীকাতে আরও :

যদি নিউলাইন = '' নির্দিষ্ট না করা থাকে তবে উদ্ধৃত ক্ষেত্রগুলির মধ্যে এম্বেড করা নতুন লাইনগুলি সঠিকভাবে ব্যাখ্যা করা হবে না এবং প্ল্যাটফর্মগুলিতে extra r \ n অতিরিক্ত write r লেখার ক্ষেত্রে লাইনডিংস যুক্ত করা হবে। সিএসভি মডিউলটি নিজস্ব (সার্বজনীন) নিউলাইন হ্যান্ডলিংয়ের কাজ করে, তাই নিউলাইন = '' নির্দিষ্ট করা সর্বদা নিরাপদ হওয়া উচিত।


2
@ ইবো-ইয়াং, আপনি আমাকে অনেক সময় বাঁচিয়েছেন।
1man

4
গ্রেট। আমি অজগর 3.5
जेফ

কেন এটি ডিফল্ট আচরণ হবে না?
মার্ক স্টোবার 23'18

6

আপনি সিএসভি রাইটার কমান্ডে লাইনটারমিনেটর = '\ 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
পাইথন ৩.৩.২ সহ, এটিই আমার পক্ষে কাজ করেছিল (ভাল, আমি কেবল ব্যবহার করেছি lineterminator='\n'); সিএসভি মডিউলটিকে এর উত্স বলে মনে হয়েছিল \r\n। কোনও আর্গুমেন্টের কোনও সেট openকার্যকর হয়নি।
টমি

5

কেন এটি হচ্ছে ঠিক তা আমি নিশ্চিত নই, তবে আপনার ফাইল মোডটি "ডাব্লু" থেকে "ডাব্লু ডাব্লু" পরিবর্তন করে এটি সংশোধন করে। আরও তথ্যের জন্য " কীভাবে এম এম অপসারণ করবেন" আমার উত্তর দেখুন ।


3

এই জাতীয় ক্রিয়াকলাপটি খুলতে আপনাকে এ্যাট্রিবিউট নতুনলাইন = "\ n" যুক্ত করতে হবে:

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

2

দ্রষ্টব্য যে আপনি যদি ডিকট্রাইটার ব্যবহার করেন তবে আপনার খোলা ফাংশন থেকে একটি নতুন লাইন এবং লেখক ফাংশন থেকে একটি নতুন লাইন থাকবে। অতিরিক্ত নিউলাইনটি সরাতে আপনি খোলা ফাংশনটির মধ্যে নিউলাইন = '' ব্যবহার করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.