簡體   English   中英

將數據從 .csv 文件轉換為 .json - Python

[英]Converting data from .csv file to .json - Python

我需要將數據從我的csv文件轉換為我要使用的.js

Lp.;Name;Surname;Desc;Unit;Comment
1;Jan;Makowski;Inf;km;
2;Anna;Nowak;Pts;km;Brak reakcji

如果你能看到'comment'欄並不總是有記錄,我需要保持這種方式。 同樣在數據之間,我還需要設置許多選項卡。

在此處輸入圖片說明

我有一個文件,我現在正在處理,但它按行顯示我的數據,例如:

[{"Lp.;Name;Surname;Desc;Unit;Comment": "1;Jan;Makowski;Inf;km;"}, {"Lp.;Name;Surname;Desc;Unit;Comment": "2;Anna;Nowak;Pts;km;Brak reakcji"...]

我是 python 的新手,我不知道如何定義我需要得到的東西。

@@ 編輯我設法做到了...

import json
import csv

# Deklaracja danych
fieldnames = ("Lp.", "Name", "Surname", "Desc", "Unit", "Comment")

#  Otwieranie plików
with open('file.csv', 'r', encoding = "utf8") as csvfile:
    reader = csv.DictReader(csvfile) # ,fieldnames)
    rows = list(reader)

# Zamykamy plik
csvfile.close()

# Tworzymy plik z danych
with open('file.json', 'w', encoding = "utf8") as jsonfile:
    json.dump(rows,jsonfile)
    # jsonfile.write(s.replace(';', '/t'))
# Zamykamy plik
csvfile.close()

我認為這是你的答案,這可能不是最好的方法,但它可以給你結果。

import csv
import json
with open('file.csv', 'r') as f:
    reader = csv.reader(f, delimiter=';')
    data_list = list()
    for row in reader:
        data_list.append(row)
data = [dict(zip(data_list[0],row)) for row in data_list]
data.pop(0)
s = json.dumps(data)
print (s)

輸出:

[{"Comment": "", "Surname": "Makowski", "Name": "Jan", "Lp.": "1", "Unit": "km", "Desc": "Inf"}, {"Comment": "Brak reakcji", "Surname": "Nowak", "Name": "Anna", "Lp.": "2", "Unit": "km", "Desc": "Pts"}]

Pandas 有內置的.read_csv().to_json() 作為中間件,您將獲得一個數據框,您可以使用它來操作數據,包括定義索引或數據模型。

import pandas as pd
df = pd.read_csv('file.csv')
# any operations on dataframe df
df.to_json('file.json')

考慮到python的一些細節,您可以將腳本最小化很多:

import csv
import json

with open('file.csv', 'r', encoding='utf8') as csvfile:
    with open('file.json', 'w', encoding='utf8') as jsonfile:
        reader = csv.DictReader(csvfile, delimiter=';')
        json.dump(list(reader), jsonfile)

有關此操作原因的詳細信息:

  1. 當塊“完成”時,作為 with 語句的一部分打開的文件會自動關閉。 (對應的PEP: https : //www.python.org/dev/peps/pep-0343/
  2. 列表構造函數可以將迭代器(例如 csv.DictReader)作為參數。 (DictReader 文檔: https ://docs.python.org/3.7/library/csv.html#csv.DictReader)

這將在內存中創建一個列表,其中包含 csv 文件中每一行的字典,如果您正在處理非常大的文件,這可能值得記住。 遺憾的是,據我所知,在不修改迭代器或序列化器的情況下將迭代器直接發送到 json 序列化器是不可能的。

我將把關於從維護和可讀性的角度來看哪種解決方案更好的爭論留給讀者作為練習。


如果您不是從磁盤上的本地文件讀取,而是通過 stdin 從另一個程序讀取,則不需要打開輸入文件:

import csv
import json
import sys

with open('file.json', 'w', encoding='utf8') as jsonfile:
    reader = csv.DictReader(sys.stdin, delimiter=';')
    json.dump(list(reader), jsonfile)

通過print()json.dump(..., sys.stdout)輸出到 stdout json.dump(..., sys.stdout)

您可以嘗試使用 csvjson 命令行工具(用 Python 編寫),而不是編寫腳本:

http://csvkit.readthedocs.io/en/1.0.2/scripts/csvjson.html?highlight=csvjson

一個非常快速的解決方案示例:

import csv

output = []
with open('your_file.csv', 'rb') as csvfile:
    reader = csv.DictReader(csvfile)
    output = [item for item in reader]
json.dump(open('your_file.json'), output)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM