কীভাবে সিএসভি ফাইলকে মাল্টলাইন জেএসএনে রূপান্তর করবেন?


98

এখানে আমার কোড, সত্যিই সহজ জিনিস ...

import csv
import json

csvfile = open('file.csv', 'r')
jsonfile = open('file.json', 'w')

fieldnames = ("FirstName","LastName","IDNumber","Message")
reader = csv.DictReader( csvfile, fieldnames)
out = json.dumps( [ row for row in reader ] )
jsonfile.write(out)

কিছু ক্ষেত্রের নাম ঘোষণা করুন, পাঠক ফাইলটি পড়ার জন্য সিএসভি ব্যবহার করেন এবং ফাইলটি একটি জেএসওএন ফর্ম্যাটে ফেলে দেওয়ার জন্য দায়েরকৃত নামগুলি ব্যবহার করে। সমস্যা এখানে ...

সিএসভি ফাইলে প্রতিটি রেকর্ড আলাদা আলাদা সারিতে থাকে। আমি চাই জেএসএন আউটপুটও একইভাবে হোক। সমস্যাটি হ'ল এটি সমস্ত এক বিশাল দৈর্ঘ্যের লাইনে ফেলে দেয়।

আমি এর মতো কিছু ব্যবহার করার চেষ্টা করেছি for line in csvfile:এবং তারপরে নীচে আমার কোডটি চালানোর চেষ্টা করেছি reader = csv.DictReader( line, fieldnames)যার সাহায্যে প্রতিটি লাইনের মধ্য দিয়ে লুপ হয় তবে এটি সম্পূর্ণ একটি ফাইলকে এক লাইনে করে, তারপরে পুরো লাইনটি অন্য লাইনে লুপ করে ... যতক্ষণ না এটি লাইন শেষ না হয় ।

এটি সংশোধন করার জন্য কোনও পরামর্শ?

সম্পাদনা করুন: স্পষ্ট করতে, বর্তমানে আমার কাছে রয়েছে: (প্রতিটি লাইনে 1 নথি)

[{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}]

আমি যা খুঁজছি: (2 লাইনে 2 টি রেকর্ড)

{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"}
{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}

প্রতিটি পৃথক ক্ষেত্র পৃথক লাইনে ইন্ডেন্ট করা / নয়, তবে এর নিজস্ব লাইনের প্রতিটি রেকর্ড।

কিছু নমুনা ইনপুট।

"John","Doe","001","Message1"
"George","Washington","002","Message2"

আমি নিশ্চিত নই যে আপনার কোড আপনি যা বলেছেন ঠিক তেমন করে ; এটি উত্পাদন করা উচিত [{..row..},{..row..},...]নয় {..row..}{..row..}..। এটি বলার অপেক্ষা রাখে না যে আউটপুটটিকে দেখে মনে হচ্ছে এটি জসন অবজেক্টগুলির একটি জসন অ্যারে হবে, সংযুক্ত সংযুক্ত জসন বস্তুর স্ট্রিম নয়।
সিঙ্গেলাইজেশন ইলিমিনেশন

উত্তর:


146

আপনার পছন্দসই আউটপুট নিয়ে সমস্যাটি হ'ল এটি বৈধ জাসন নথি নয়; এটা একটা জসন নথির স্ট্রিম !

এটি ঠিক আছে, যদি এটি আপনার প্রয়োজন হয় তবে এর অর্থ হ'ল আপনার আউটপুটে প্রতিটি ডকুমেন্টের জন্য আপনাকে কল করতে হবে json.dumps

যেহেতু আপনি আপনার দস্তাবেজগুলি পৃথক করতে চান নতুন লাইনটি সেই নথিতে অন্তর্ভুক্ত নেই, তাই আপনি নিজেই সরবরাহের জন্য হুকের উপরে রয়েছেন। সুতরাং আমাদের কেবল json.dump কল থেকে লুপটি টেনে আনা এবং প্রতিটি নথির লিখিত জন্য নতুন লাইনগুলি ইন্টারপোজ করা দরকার।

import csv
import json

csvfile = open('file.csv', 'r')
jsonfile = open('file.json', 'w')

fieldnames = ("FirstName","LastName","IDNumber","Message")
reader = csv.DictReader( csvfile, fieldnames)
for row in reader:
    json.dump(row, jsonfile)
    jsonfile.write('\n')

4
পারফেক্ট! দুঃখিত, এটি পেতে আপনাকে কিছুটা মন পড়তে হয়েছিল, এবং সংশোধন / স্পষ্টির জন্য ধন্যবাদ। আমি ঠিক এটিই খুঁজছিলাম।
BeanBagKing

4
তবে সমস্যাটি
আউটফাইল

4
@ মন্টিএইচএস: এই উত্তরের প্রথম প্রেরণায় ব্যাখ্যা করা হয়েছে যে আউটফাইল কোনও জাসন নথি নয়; এবং এটি পরিবর্তে কি। যে ব্যক্তি এই প্রশ্নটি জিজ্ঞাসা করেছেন তার থেকে আপনার কি অন্যরকম সমস্যা হচ্ছে?
সিঙ্গেলাইজেশন ইলিমিনেশন

6
@ ab161610: আপনি যদি ইনপুটটিতে শিরোনামের প্রত্যাশা করেন তবে আপনার পক্ষে যুক্তি DictReaderনা দিয়েই নির্মাণ করা উচিত fieldnames; এটি ফাইল থেকে ক্ষেত্রের নামগুলি পেতে প্রথম লাইনটি পড়বে।
সিঙ্গেলএজিগেশন ইলিমিনেশন

4
এবং আপনার ফাইলগুলির জন্য এনকোডিং যুক্ত করা ভাল csvfile = open('file.csv', 'r',encoding='utf-8') এবং jsonfile = open('file.json', 'w',encoding='utf-8')
মেরেক বার্নার্ড

23

এটি অর্জনের জন্য আপনি পান্ডাস ডেটা ফ্রেম ব্যবহার করতে পারেন, নিম্নলিখিত উদাহরণ সহ:

import pandas as pd
csv_file = pd.DataFrame(pd.read_csv("path/to/file.csv", sep = ",", header = 0, index_col = False))
csv_file.to_json("/path/to/new/file.json", orient = "records", date_format = "epoch", double_precision = 10, force_ascii = True, date_unit = "ms", default_handler = None)

10
import csv
import json

file = 'csv_file_name.csv'
json_file = 'output_file_name.json'

#Read CSV File
def read_CSV(file, json_file):
    csv_rows = []
    with open(file) as csvfile:
        reader = csv.DictReader(csvfile)
        field = reader.fieldnames
        for row in reader:
            csv_rows.extend([{field[i]:row[field[i]] for i in range(len(field))}])
        convert_write_json(csv_rows, json_file)

#Convert csv data into json
def convert_write_json(data, json_file):
    with open(json_file, "w") as f:
        f.write(json.dumps(data, sort_keys=False, indent=4, separators=(',', ': '))) #for pretty
        f.write(json.dumps(data))


read_CSV(file,json_file)

Json.dumps এর ডকুমেন্টেশন ()


সঠিক উত্তর, imho।
জনিফ্রমবিএফ

9

আমি @ সিঙ্গেলনেগেশন ইলিমিনেশনের প্রতিক্রিয়া নিয়েছি এবং এটি একটি পাইপলাইনে ব্যবহার করা যেতে পারে এমন একটি তিন-লাইনারে সরলীকৃত করেছি:

import csv
import json
import sys

for row in csv.DictReader(sys.stdin):
    json.dump(row, sys.stdout)
    sys.stdout.write('\n')

6

আপনি চেষ্টা করতে পারেন এই

import csvmapper

# how does the object look
mapper = csvmapper.DictMapper([ 
  [ 
     { 'name' : 'FirstName'},
     { 'name' : 'LastName' },
     { 'name' : 'IDNumber', 'type':'int' },
     { 'name' : 'Messages' }
  ]
 ])

# parser instance
parser = csvmapper.CSVParser('sample.csv', mapper)
# conversion service
converter = csvmapper.JSONConverter(parser)

print converter.doConvert(pretty=True)

সম্পাদনা করুন:

সহজ পদ্ধতি

import csvmapper

fields = ('FirstName', 'LastName', 'IDNumber', 'Messages')
parser = CSVParser('sample.csv', csvmapper.FieldMapper(fields))

converter = csvmapper.JSONConverter(parser)

print converter.doConvert(pretty=True)

4
আমি মনে করি আপনার অন্তত csvmapperঅন্তর্নিহিত কোনও কিছুর বিপরীতে এটি করার জন্য (এবং সম্ভবত এটি কোথায় পাওয়া যাবে) তৃতীয় পক্ষের মডিউল ব্যবহার করছেন, আপনার স্পষ্টভাবে উল্লেখ করা উচিত।
মার্টিনো

2

এতে indentপ্যারামিটার যুক্ত করুনjson.dumps

 data = {'this': ['has', 'some', 'things'],
         'in': {'it': 'with', 'some': 'more'}}
 print(json.dumps(data, indent=4))

আরও মনে রাখবেন যে, আপনি json.dumpখালি সাথে খালি ব্যবহার করতে পারেন jsonfile:

json.dump(data, jsonfile)

আমি যা খুঁজছি তা পুরোপুরি নয়। আমি আমার আসল প্রশ্নটি সম্পাদনা করে কাঙ্ক্ষিত আউটপুটটি স্পষ্ট করতে এবং দেখানোর জন্য করেছি। টিপটির জন্য আপনাকে ধন্যবাদ যদিও এটি পরে কার্যকর হতে পারে।
বিয়ানব্যাগিং

2

আমি দেখতে পাচ্ছি যে এটি পুরানো তবে আমার সিঙ্গেলনেগেশন ইলিমিনেশন থেকে কোডের প্রয়োজন ছিল তবে আমার ইউটিএফ -8 অক্ষরযুক্ত ডেটা নিয়ে সমস্যা হয়েছে। এগুলি ক্ষেত্রগুলিতে উপস্থিত হয়েছিল আমি অত্যধিক উদ্বিগ্ন ছিলাম না তাই আমি সেগুলি উপেক্ষা করা বেছে নিয়েছিলাম। তবে এতে কিছুটা প্রচেষ্টা নেওয়া হয়েছিল। আমি অজগরে নতুন তাই কিছু পরীক্ষার এবং ত্রুটির সাথে আমি এটি কাজে লাগিয়েছি। কোডটি ইউএফএফ -8 এর অতিরিক্ত পরিচালনা সহ একক নেগেশন ইলিমিনেশনের একটি অনুলিপি। আমি https://docs.python.org/2.7/library/csv.html দিয়ে এটি করার চেষ্টা করেছি কিন্তু শেষ পর্যন্ত ছেড়ে দিয়েছি । নীচের কোডটি কাজ করেছিল।

import csv, json

csvfile = open('file.csv', 'r')
jsonfile = open('file.json', 'w')

fieldnames = ("Scope","Comment","OOS Code","In RMF","Code","Status","Name","Sub Code","CAT","LOB","Description","Owner","Manager","Platform Owner")
reader = csv.DictReader(csvfile , fieldnames)

code = ''
for row in reader:
    try:
        print('+' + row['Code'])
        for key in row:
            row[key] = row[key].decode('utf-8', 'ignore').encode('utf-8')      
        json.dump(row, jsonfile)
        jsonfile.write('\n')
    except:
        print('-' + row['Code'])
        raise

1

কীভাবে পান্ডাসকে সিএসভি ফাইলটি ডেটাফ্রেমে ( পিডি.ড্রেড_সিএসভি ) পড়ার জন্য ব্যবহার করা যায় , তারপরে আপনি কলামগুলি ম্যানিপুলেটেড (সেগুলি বাদ দিয়ে বা মান আপডেট করতে) এবং পরিশেষে ডাটাফ্রেমটিকে জেএসএন-তে রূপান্তর করতে পারেন ( পিডি.ডাটাফ্রেম.টো_জেসন) )।

দ্রষ্টব্য: এটি কতটা দক্ষ হবে তা আমি পরীক্ষা করে দেখিনি তবে এটি অবশ্যই একটি বৃহত সিএসভিকে জেসসনে রূপান্তর করার সহজতম উপায়।


0

@ মন্টিএইচএস উত্তরের সামান্য উন্নতি হিসাবে, ক্ষেত্রের নামগুলির একটি টুপ মাধ্যমে পুনরাবৃত্তি:

import csv
import json

csvfilename = 'filename.csv'
jsonfilename = csvfilename.split('.')[0] + '.json'
csvfile = open(csvfilename, 'r')
jsonfile = open(jsonfilename, 'w')
reader = csv.DictReader(csvfile)

fieldnames = ('FirstName', 'LastName', 'IDNumber', 'Message')

output = []

for each in reader:
  row = {}
  for field in fieldnames:
    row[field] = each[field]
output.append(row)

json.dump(output, jsonfile, indent=2, sort_keys=True)

-1
import csv
import json
csvfile = csv.DictReader('filename.csv', 'r'))
output =[]
for each in csvfile:
    row ={}
    row['FirstName'] = each['FirstName']
    row['LastName']  = each['LastName']
    row['IDNumber']  = each ['IDNumber']
    row['Message']   = each['Message']
    output.append(row)
json.dump(output,open('filename.json','w'),indent=4,sort_keys=False)

যখন আমি এটি ব্যবহার করার চেষ্টা করি তখন আমি "কী-এরর: 'ফার্স্টনাম'" পাই। কীটি যুক্ত হচ্ছে বলে মনে হচ্ছে না। আপনি এখানে কী করতে চাইছেন তা আমি নিশ্চিত নই, তবে আপনি যে ওয়েনের মতো একই ইনডেন্ট = 4 ব্যবহার করেছেন সেহেতু আউটপুটটি আমি যা খুঁজছি তার সাথে মিলে যায় বলে আমি মনে করি না। আমার কী আউটপুট আশা করা উচিত? আমি যা খুঁজছি তা স্পষ্ট করতে আমি আমার মূল পোস্টটি সম্পাদনা করেছি।
BeanBagKing

মূল ত্রুটিটি সম্ভবত কারণ এই কোডটি একটি শিরোনাম যুক্তিটি পাস করে না DictReader, সুতরাং এটি ইনপুট ফাইলের প্রথম লাইন থেকে ক্ষেত্রের নামগুলি অনুমান করছে: "ফার্স্টনাম, লাস্টনাম," এবং "জনন, ডো, 5" এর পরিবর্তে "কিছুই নয়" ইত্যাদি ...
সিঙ্গলএইজেশনএলিমিনেশন

আরও ভাল বিকল্প, এটি আসলে কাঙ্ক্ষিত ক্ষেত্রগুলির জন্য CSV কে
বিশ্লেষণ করে

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