为了账号安全,请及时绑定邮箱和手机立即绑定

确定文件“更有可能”是 json 还是 csv

确定文件“更有可能”是 json 还是 csv

慕桂英4014372 2021-11-09 15:12:03
我有一些带有通用扩展名的文件,例如“txt”或根本没有扩展名。我试图以非常快速的方式确定文件是 json 还是 csv。我想过使用该magic模块,但它不适用于我正在尝试做的事情。例如:>>> import magic>>> magic.from_file('my_json_file.txt')'ASCII text, with very long lines, with no line terminators'有没有更好的方法来确定某些东西是 json 还是 csv?我无法加载整个文件,我想以非常快速的方式确定它。这里有什么好的解决方案?
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

您可以检查文件是否以{或开头,[以确定它是否为 JSON,并且您可以加载前两行csv.reader并查看两行是否具有相同的列数,以确定它是否为 CSV。


import csv

with open('file') as f:

    if f.read(1) in '{[':

        print('likely JSON')

    else:

        f.seek(0)

        reader = csv.reader(f)

        try:

            if len(next(reader)) == len(next(reader)) > 1:

                print('likely CSV')

        except StopIteration:

            pass


查看完整回答
反对 回复 2021-11-09
?
慕斯王

TA贡献1864条经验 获得超2个赞

您可以使用try/catch“技术”尝试将数据解析为 JSON 对象。从字符串加载无效格式的 JSON 时,它会引发一个ValueError您可以根据需要捕获和处理的值:


>>> import json

>>> s1 = '{"test": 123, "a": [{"b": 32}]}'

>>> json.loads(s1)

如果有效,则什么都不会发生,如果无效:


>>> import json

>>> s2 = '1;2;3;4'

>>> json.loads(s2)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads

    return _default_decoder.decode(s)

  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 369, in decode

    raise ValueError(errmsg("Extra data", s, end, len(s)))

ValueError: Extra data: line 1 column 2 - line 1 column 8 (char 1 - 7)

因此,您可以按如下方式构建函数:


import json


def check_format(filedata):

    try:

        json.loads(filedata)

        return 'JSON'

    except ValueError:

        return 'CSV'


>>> check_format('{"test": 123, "a": [{"b": 32}]}')

'JSON'

>>> check_format('1;2;3;4')

'CSV'


查看完整回答
反对 回复 2021-11-09
  • 2 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信