পাইথনের সাথে লিখিত সিএসভি ফাইলের প্রতিটি সারির মধ্যে ফাঁকা রেখা থাকে


446
import csv

with open('thefile.csv', 'rb') as f:
  data = list(csv.reader(f))
  import collections
  counter = collections.defaultdict(int)

  for row in data:
        counter[row[10]] += 1


with open('/pythonwork/thefile_subset11.csv', 'w') as outfile:
    writer = csv.writer(outfile)
    for row in data:
        if counter[row[10]] >= 504:
           writer.writerow(row)

এই কোডটি পড়তে thefile.csv, পরিবর্তন করে এবং এতে ফলাফল লেখায় thefile_subset1

যাইহোক, যখন আমি মাইক্রোসফ্ট এক্সেলে ফলাফল সিএসভি খুলি, তখন প্রতিটি রেকর্ডের পরে অতিরিক্ত ফাঁকা রেখা থাকে!

এটি অতিরিক্ত ফাঁকা রেখা না রাখার উপায় আছে কি?


4
দয়া করে নিশ্চিত করুন যে আপনি যখন উইন্ডোজে
জন মাচিন


: এই থ্রেডে উত্তর দেখার stackoverflow.com/questions/3348460/...
Febin ম্যাথু

উত্তর:


887

পাইথন 2 এ, পরিবর্তে outfileমোড দিয়ে খুলুন । লিখেছেন সরাসরি ফাইলে। আপনি যদি বাইনারি মোডে ফাইলটি না খোলেন তবে এটি লিখবে কারণ উইন্ডোজ পাঠ্য মোডে প্রতিটি অনুবাদ করা হবে ।'wb''w'csv.writer\r\n\r\r\n\n\r\n

পাইথন 3 এ প্রয়োজনীয় সিনট্যাক্স পরিবর্তন হয়েছে (নীচে ডকুমেন্টেশনের লিঙ্কগুলি দেখুন), সুতরাং পরিবর্তে outfileঅতিরিক্ত প্যারামিটার newline=''(খালি স্ট্রিং) দিয়ে খুলুন ।

উদাহরণ:

# Python 2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
    writer = csv.writer(outfile)

# Python 3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)

ডকুমেন্টেশন লিঙ্ক


1
যাইহোক, @ মার্ক টলোনেনের উত্তর একটি স্ট্যান্ডার্ড (কোনও সিএসভি ব্যবহার করা হয়নি) পাঠ্য ফাইল সংরক্ষণ করার সময় যুক্ত হওয়া অতিরিক্ত লাইন (গুলি) সম্পর্কিত অনেকগুলি প্রশ্নের সমাধান করেছিল।
dlewin

1
2.6 / 2.7 এবং 3 এর মধ্যে সামঞ্জস্যের জন্য, আপনি যুক্তি io.openদিয়ে ব্যবহার করতে পারেন newlines। আপনি যদি এখনও 2.x এ লিখছেন তবে এটি এগিয়ে সুসংগত যেহেতু এটি আরও ভাল পছন্দ বলে মনে হচ্ছে।
jpmc26

@ jpmc26 সাধারণত এটি ভাল পরামর্শ, তবে সিএসভি মডিউলটি সঠিকভাবে কাজ করে না io.openunicodecsvপাইথন ২.7 এর জন্য একটি তৃতীয় পক্ষের মডিউল রয়েছে যা আরও ভাল কাজ করে।
মার্ক টোলোনেন

newline=''কৌশলটি স্ট্রিংআইও বা টেম্পোরারিফাইলে পাইথন 3 তে কাজ করে না এমন কোনও ধারণা ?
fmoo

@fmoo সংজ্ঞা দেয় "কাজ করে না"। তারা দু'জনেই আমার প্রত্যাশা মতো কাজ করে। StringIOকোনও কোডে এনকোড করা হবে এমন একই কোড পয়েন্টগুলি বাফার TemporaryFileকরে এবং newlineপ্যারামিটার সমর্থন করে , তাই এটি হিসাবে খোলা যেতে পারে open। কাজ করছে না এমন একটি নমুনা প্রোগ্রাম সহ একটি প্রশ্ন জিজ্ঞাসা করুন।
মার্ক টোলোনেন

65

বাইনারি মোড "wb" ফাইলটি খোলার ফলে পাইথন 3+ এ কাজ করবে না। বা বরং, আপনার ডেটা লেখার আগে বাইনারি রূপান্তর করতে হবে। এটাই কেবল ঝামেলা।

পরিবর্তে, আপনার এটি পাঠ্য মোডে রাখা উচিত, তবে নতুন লাইনটি খালি হিসাবে ওভাররাইড করা উচিত। তাই ভালো:

with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:

13

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

এর সাথে ফিডিং lineterminatorসমাধান নয়।


এই সিএসভি "স্ট্যান্ডার্ড" কোনটির আপনি বলছেন?
ড্যান ব্রেস্লাউ

3
@ ড্যান: আমি বিশেষ্য হিসাবে "স্ট্যান্ডার্ড" ব্যবহার করেছি, বিশেষ্য নয়, যার অর্থ "সাধারণ" বা "সাধারণ জায়গা"। আপনি যদি কোনও (বিশেষ্য) মানটির
জন মাচিন

1
পয়েন্টটি (আপনি বোঝাচ্ছেন) কোনও মান নেই। সেই আরএফই তথ্যবহুল। যদিও উইন্ডোজে \ r on n "স্ট্যান্ডার্ড" হতে পারে তবে আমি নিশ্চিত যে ইউনিক্স অ্যাপ্লিকেশনগুলি সাধারণত এটি সেভাবে দেখেনি।
ড্যান ব্রেসলাউ

2
@ ড্যান: এটি সঠিক - কোনও মান নেই। স্ক্রিপ্টগুলিতে লাইনটারমিনেটরটি নির্দিষ্ট করা উচিত [তাদের নাম রাখা উচিত রাউটারমিনেটর] যা তারা চান (ডিফল্ট না হলে) এবং স্ক্রিপ্টটি উইন্ডোতে চালিত হওয়ার ক্ষেত্রে বাইনারি মোড ব্যবহার করুন অন্যথায় "লাইনটারমিনেটর" স্টাফ করা হতে পারে।
জন মাচিন

8

দ্রষ্টব্য: উইন্ডোজ সিস্টেমে কীভাবে অতিরিক্ত লাইন যুক্ত করা হচ্ছে তার কারণে এটি পছন্দসই সমাধান নয়। পাইথন ডকুমেন্টে বলা হয়েছে :

Csvfile যদি কোনও ফাইল অবজেক্ট হয় তবে এটি অবশ্যই প্ল্যাটফর্মগুলিতে 'বি' পতাকা সহ খোলার দরকার যেখানে এটি কোনও পার্থক্য করে।

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

পাইথন ডক্স থেকে :

উইন্ডোজে, মোডে সংযুক্ত 'বি' ফাইলটি বাইনারি মোডে খোলে, সুতরাং 'আরবি', 'ডাব্লুবি', এবং 'আর + বি' এর মতো মোডগুলিও রয়েছে। উইন্ডোজে পাইথন পাঠ্য এবং বাইনারি ফাইলগুলির মধ্যে পার্থক্য তৈরি করে; পাঠ্য ফাইলগুলিতে প্রান্তের অক্ষরের অক্ষরগুলি স্বয়ংক্রিয়ভাবে কিছুটা পরিবর্তিত হয় যখন ডেটা পড়া বা লেখা হয়। পর্দার আড়ালে থাকা এই ফাইলটি ডেটা ফাইলের জন্য সংশোধন করা ASCII পাঠ্য ফাইলগুলির পক্ষে ঠিক আছে, তবে এটি জেপিইজি বা এক্সই ফাইলগুলিতে বাইনারি ডেটাগুলিকে দূষিত করবে। এই জাতীয় ফাইলগুলি পড়তে এবং লেখার সময় বাইনারি মোড ব্যবহার করতে খুব সাবধান হন। ইউনিক্সে, মোডে 'বি' যুক্ত করতে কোনও ক্ষতি হয় না, তাই আপনি সমস্ত বাইনারি ফাইলগুলির জন্য এটি প্ল্যাটফর্ম-স্বাধীনভাবে ব্যবহার করতে পারেন can

মূল :

Csv.writer এর জন্য alচ্ছিক প্যারামিটারগুলির অংশ হিসাবে যদি আপনি অতিরিক্ত ফাঁকা লাইন পেয়ে থাকেন তবে আপনাকে লাইনটারমিনেটর পরিবর্তন করতে হতে পারে ( এখানে তথ্য )। পাইথন পৃষ্ঠা সিএসভি ডক্স থেকে নীচে রূপান্তরিত উদাহরণ এটি '\ n' থেকে যা কিছু হওয়া উচিত তা পরিবর্তন করুন। যেহেতু সমস্যাটি অন্ধকারের মধ্যে কেবল ছুরিকাঘাত এটি কাজ করতে পারে বা নাও পারে তবে এটি আমার সেরা অনুমান।

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n')
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

আমি এই সম্পর্কে পোস্ট করতে চলেছি - লাইনটারিমেণেটার = '। N' একটি সাধারণ পরীক্ষায় আমার জন্য কাজ করেছিল।
ড্যান ব্রেসলাউ

আমি কি এটি করতে পারি> ?? ওপেন ('/ পাইথন ওয়ার্ক / thefile_subset11.csv', 'ডাব্লু') সহ, লাইনটারমিনেটর = '\ n'
আউটফিল

1
@ আই__: আপনার সত্যই পাইথন ডক্সকে বোঝানো শুরু করা উচিত। ডেরেক আপনাকে লিঙ্কটি দিয়েছে: ডকস.পিথথন.আর
ড্যান ব্রেসলাউ

5

আমি এই উত্তরটি অজগর 3 তে লিখছি, কারণ প্রথমদিকে আমি একই সমস্যা পেয়েছি।

আমার কাছে আরডুইনো ব্যবহার করে ডেটা পাওয়ার কথা ছিল PySerialএবং সেগুলি একটি .csv ফাইলে লিখতে হবে। আমার ক্ষেত্রে প্রতিটি পড়া শেষ হয়েছে '\r\n', সুতরাং নতুন লাইন সর্বদা প্রতিটি লাইন পৃথক করে চলেছিল।

আমার ক্ষেত্রে, newline=''বিকল্প কাজ করে না। কারণ এটি কিছু ত্রুটি যেমন দেখিয়েছিল:

with open('op.csv', 'a',newline=' ') as csv_file:

ValueError: illegal newline value: ''

সুতরাং দেখে মনে হয়েছিল যে তারা এখানে নতুন লাইন বাদ দেওয়া গ্রহণ করে না।

কেবলমাত্র এখানে একটি উত্তর দেখে আমি লেখক অবজেক্টে লাইন টার্মিনেটর উল্লেখ করেছি,

writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')

এবং এটি অতিরিক্ত নিউলাইনগুলি এড়িয়ে যাওয়ার জন্য আমার পক্ষে কাজ করেছিল।


2
এটি ভুল। with open('my_file.csv', 'a',newline='') as csvfile: একেবারে সূক্ষ্ম কাজ করে। আপনার উত্তরের সমস্যাটি হ'ল এখানে আপনি ' 'পরিবর্তে লিখছেন''
নাসরিন

2
with open(destPath+'\\'+csvXML, 'a+') as csvFile:
    writer = csv.writer(csvFile, delimiter=';', lineterminator='\r')
    writer.writerows(xmlList)

"লাইনটারিনেটর = '' r '" পরের সারিতে যাওয়ার অনুমতি, দুজনের মধ্যে খালি সারি ছাড়াই।


1

এই উত্তর থেকে , ণ নেওয়ার পরে , মনে হচ্ছে এটি সবচেয়ে পরিষ্কার সমাধানটি ব্যবহার করা io.TextIOWrapper। আমি নিম্নলিখিত হিসাবে নিজের জন্য এই সমস্যাটি সমাধান করতে পেরেছি:

from io import TextIOWrapper

...

with open(filename, 'wb') as csvfile, TextIOWrapper(csvfile, encoding='utf-8', newline='') as wrapper:
    csvwriter = csv.writer(wrapper)
    for data_row in data:
        csvwriter.writerow(data_row)

উপরোক্ত উত্তরটি পাইথন ২ এর সাথে সামঞ্জস্যপূর্ণ নয়, সামঞ্জস্যতা রাখতে, আমি মনে করি যে কোনও একটি ifব্লগে সমস্ত লেখার যুক্তিটি কেবল মোড়ানো দরকার :

if sys.version_info < (3,):
    # Python 2 way of handling CSVs
else:
    # The above logic

0

সিএসভি ফাইলে ডেটা লিখতে নীচে সংজ্ঞায়িত পদ্ধতিটি ব্যবহার করুন।

open('outputFile.csv', 'a',newline='')

পদ্ধতির newline=''ভিতরে কেবল একটি অতিরিক্ত পরামিতি যুক্ত করুন open:

def writePhoneSpecsToCSV():
    rowData=["field1", "field2"]
    with open('outputFile.csv', 'a',newline='') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow(rowData)

এটি অতিরিক্ত সারি তৈরি না করেই সিএসভি সারি লিখবে!


-1

পাইথন 3 ব্যবহার করার সময় কোডেকস মডিউলটি ব্যবহার করে খালি লাইনগুলি এড়ানো যায় । ডকুমেন্টেশনে যেমন বলা হয়েছে, ফাইলগুলি বাইনারি মোডে খোলা থাকে তাই নিউলাইন কোয়ার্গের কোনও পরিবর্তন প্রয়োজন হয় না। আমি সম্প্রতি একই সমস্যাটিতে চলেছিলাম এবং এটি আমার পক্ষে কাজ করেছে:

with codecs.open( csv_file,  mode='w', encoding='utf-8') as out_csv:
     csv_out_file = csv.DictWriter(out_csv)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.