【问题标题】:Converting data from .csv file to .json - Python将数据从 .csv 文件转换为 .json - Python
【发布时间】:2017-05-22 11:40:29
【问题描述】:

我需要将我的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()

【问题讨论】:

标签: python json csv data-conversion format-conversion


【解决方案1】:

我认为这是你的答案,这可能不是最好的方法,但它可以给你结果。

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"}]

【讨论】:

  • 我在 中出现奇怪的错误“在阅读器中的行:_csv.Error: 迭代器应该返回字符串,而不是字节(你是否以文本模式打开文件?)”你如何设法得到你的答案在那里?
  • 我刚刚将您的数据复制到了一个带有 csv 扩展名的文件中。
  • 我可以知道你的python版本吗?
  • 我正在使用最新的 3.6.1
  • @OskarGarczyński,现在你有了数据,这很酷,现在用这些数据制作视图是你的工作。
【解决方案2】:

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')

【讨论】:

  • +1。注意:默认情况下to_json() 将按列输出。或者,使用orient 参数获取逐行输出,例如df.to_json(..., orient='records').
【解决方案3】:

考虑到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 序列化器是不可能的。

我将从维护和可读性的角度对哪种解决方案更好的争论留给读者练习。


如果您不是从磁盘上的本地文件读取,而是通过标准输入从另一个程序读取,则无需打开输入文件:

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) 输出到标准输出也是如此。

【讨论】:

  • 如果 csv 不在文件中而是硬代码怎么办?
  • @Navi 忽略许多关于您在代码中硬编码 csv 而不是正确的 python 结构的原因,我建议查看广告 io.StringIO (docs.python.org/3/library/…)
  • 我要问的是,我没有从 csv 文件中获取数据。仅来自以 csv 格式打印的来源。在这种情况下如何将其转换为 JSON 格式?@asheidan
  • @Navi 这更有意义,但您没有提供足够的详细信息来帮助您。 “以 csv 格式打印”可能有很多东西。如果您将数据从另一个程序打印到标准输出的数据通过管道传输到您的脚本中,请删除打开 csv 文件的行并使用 sys.stdin 作为 DictReader 应读取的文件。
  • 我想你没有得到我的问题。无论如何我可以在另一个地方问你喜欢吗?
【解决方案4】:

您可以尝试使用 csvjson 命令行工具(用 Python 编写),而不是编写脚本:

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

【讨论】:

    【解决方案5】:

    一个非常简单的解决方案示例:

    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)
    

    【讨论】:

    • 'r' 是open 中的默认模式。但是 Python 文档使用 'rb' 模式(读取二进制),所以我相应地更新了答案
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2019-04-13
    • 1970-01-01
    • 2015-01-13
    • 2018-07-14
    • 2023-03-28
    相关资源
    最近更新 更多