Определите, является ли файл "более вероятным" json или csv - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть несколько файлов с обобщенными расширениями, такими как «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 ]

0 голосов
/ 14 февраля 2019

Вы можете использовать "технику" 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'
0 голосов
/ 14 февраля 2019

Вы можете проверить, начинается ли файл с { или [, чтобы определить, является ли он 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
...