确定文件是否“更可能”为json或csv

问题描述 投票:2回答:2

我有一些带有通用扩展名的文件,例如“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?我无法加载整个文件,我想以非常快的方式确定它。这里有什么好的解决方案?

python python-3.x mime
2个回答
3
投票

您可以检查文件是否以{[开头以确定它是否为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

0
投票

您可以使用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'
© www.soinside.com 2019 - 2024. All rights reserved.