স্ট্রিং (ফাইল নয়) হিসাবে আমি কীভাবে সিএসভি ফর্ম্যাটে ডেটা লিখব?


119

আমি ডেটা পছন্দ করতে চাই [1,2,'a','He said "what do you mean?"'] কোনও সিএসভি-ফর্ম্যাট স্ট্রিংয়ের ।

সাধারণত csv.writer()এটির জন্য একটি ব্যবহার করা হবে , কারণ এটি সমস্ত ক্রেজি প্রান্তের কেসগুলি পরিচালনা করে (কমা পলায়ন, উদ্ধৃতি চিহ্ন পলায়ন, সিএসভি উপভাষা ইত্যাদি) The ক্যাচটি csv.writer()কোনও স্ট্রিংকে নয়, কোনও ফাইল অবজেক্টে আউটপুট প্রত্যাশা করে।

আমার বর্তমান সমাধানটি কিছুটা হ্যাকি ফাংশন:

def CSV_String_Writeline(data):
    class Dummy_Writer:
        def write(self,instring):
            self.outstring = instring.strip("\r\n")
    dw = Dummy_Writer()
    csv_w = csv.writer( dw )
    csv_w.writerow(data)
    return dw.outstring

কেউ কি আরও মার্জিত সমাধান দিতে পারেন যা এখনও প্রান্তের কেসগুলি ভালভাবে পরিচালনা করে?

সম্পাদনা করুন: আমি এখানে এটি কীভাবে শেষ করেছি:

def csv2string(data):
    si = StringIO.StringIO()
    cw = csv.writer(si)
    cw.writerow(data)
    return si.getvalue().strip('\r\n')

2
পাইথন 3 সালে StringIO()হয় ioগ্রন্থাগার।
এরিস্টেড

উত্তর:


66

আপনি StringIOনিজের পরিবর্তে ব্যবহার করতে পারেন Dummy_Writer:

এই মডিউলটি একটি ফাইল-জাতীয় ক্লাস প্রয়োগ করে StringIO, যা একটি স্ট্রিং বাফার (মেমোরি ফাইল হিসাবেও পরিচিত) পড়তে এবং লেখায়।

রয়েছে cStringIO, এর একটি দ্রুত সংস্করণ যা StringIOবর্গ।


164

পাইথন 3 এ:

>>> import io
>>> import csv
>>> output = io.StringIO()
>>> csvdata = [1,2,'a','He said "what do you mean?"',"Whoa!\nNewlines!"]
>>> writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC)
>>> writer.writerow(csvdata)
59
>>> output.getvalue()
'1,2,"a","He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'

পাইথন 2 এর জন্য কিছু বিশদ কিছুটা পরিবর্তন করা দরকার:

>>> output = io.BytesIO()
>>> writer = csv.writer(output)
>>> writer.writerow(csvdata)
57L
>>> output.getvalue()
'1,2,a,"He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'

ভালো উদাহরণ. :) সিডনোট হিসাবে, কোনও সিএসভি ফাইলে নতুন লাইনের মুখোমুখি হওয়ার সময় স্বাভাবিক আচরণটি কী? কি \nতথ্য মাঝখানে আছে ঠিক আছে, কিন্তু \r\nকোন ব্যাপার যেখানে দেখা রেকর্ড শেষে নির্দেশ করে? (ধরে \r\n
নিই

2
হওয়া উচিত output = StringIO.StringIO(), io.StringIO()প্রকারভেদ উত্থাপন করা হবে: স্ট্রিং আর্গুমেন্ট প্রত্যাশিত, 'str' পেয়েছে।
মারবনি

2
@ মারবনি: স্ট্রিংআইও পাইথন 3 এ চলে গেছে (যা আমার সমাধানটিতে লেখা আছে), এবং পাইথন ২..3.৩ এ আমি সেই ত্রুটিটি পুনরুত্পাদন করতে পারি না - যদিও আমি writer.writerow(...)লাইনে টাইপ-এয়ার পেয়েছি ( unicode argument expected, got 'str')। এটি খতিয়ে দেখবে।
টিম পিটজ্যাকার

1
@ মারবনি: মাথা উঁচু করার জন্য ধন্যবাদ: স্ট্যাকওভারফ্লো এর সাহায্যে আমি সমস্যাটি পেয়েছি। পাইথন 2 এ io.BytesIO()পরিবর্তে আপনার প্রয়োজন io.StringIO()
টিম পিটজ্যাকার

1
@ মারবনি: পাইথন ২.7.৯ এ এটি স্ট্রিংআইও.স্ট্রিংআইও () বা io.BytesIO () এর সাথে কাজ করে।
শ্রোক করুন

6

আমি উত্তরগুলি পেয়েছি, সব মিলিয়ে কিছুটা বিভ্রান্তির। পাইথন 2 এর জন্য, এই ব্যবহারটি আমার পক্ষে কাজ করেছিল:

import csv, io

def csv2string(data):
    si = io.BytesIO()
    cw = csv.writer(si)
    cw.writerow(data)
    return si.getvalue().strip('\r\n')

data=[1,2,'a','He said "what do you mean?"']
print csv2string(data)

2

যেহেতু আমি সানিক থেকে ব্যবহারকারীকে সিএসভি ডেটা হিসাবে অবিচ্ছিন্নভাবে ফলাফলগুলি স্ট্রিম করতে এটি বেশ ব্যবহার করি আমি পাইথন 3 এর জন্য নিম্নলিখিত স্নিপেটটি লিখেছি ।

স্নিপেট আপনাকে বার বার একই স্ট্রিংআইও বাফারটিকে পুনরায় ব্যবহার করতে দেয়।


import csv
from io import StringIO


class ArgsToCsv:
    def __init__(self, seperator=","):
        self.seperator = seperator
        self.buffer = StringIO()
        self.writer = csv.writer(self.buffer)

    def stringify(self, *args):
        self.writer.writerow(args)
        value = self.buffer.getvalue().strip("\r\n")
        self.buffer.seek(0)
        self.buffer.truncate(0)
        return value + "\n"

উদাহরণ:

csv_formatter = ArgsToCsv()

output += csv_formatter.stringify(
    10,
    """
    lol i have some pretty
    "freaky"
    strings right here \' yo!
    """,
    [10, 20, 30],
)

গিথুব গিস্টে আরও ব্যবহার দেখুন: উত্স এবং পরীক্ষা


0
import csv
from StringIO import StringIO
with open('file.csv') as file:
    file = file.read()

stream = StringIO(file)

csv_file = csv.DictReader(stream)

3
কোড-কেবল উত্তরগুলি নিরুৎসাহিত করা হয়, আপনার উত্তরে আপনার কিছু স্পষ্টতা যুক্ত করা উচিত
রানিজ

-1

এই সংস্করণটি utf-8 এর জন্য কাজ করে। শেষের দিকে লাইনব্রেক ছাড়াই কেবল একটি লাইনের জন্য csvline2string, লাইন ব্রেক সহ অনেক লাইনের জন্য সিএসভি 2 স্ট্রিং:

import csv, io

def csvline2string(one_line_of_data):
    si = BytesIO.StringIO()
    cw = csv.writer(si)
    cw.writerow(one_line_of_data)
    return si.getvalue().strip('\r\n')

def csv2string(data):
    si = BytesIO.StringIO()
    cw = csv.writer(si)
    for one_line_of_data in data:
        cw.writerow(one_line_of_data)
    return si.getvalue()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.