Преобразование текстового файла в JSON в определенном формате (Python) - PullRequest
0 голосов
/ 02 октября 2019

У меня есть данные некоторого запаса в текстовом формате, и я хочу преобразовать их в JSON в определенном формате. Точки данных в текстовом файле разделяются запятыми (,), и каждая строка содержит данные с интервалом 1 мин. Также в некоторых строках есть дополнительные ненужные данные в конце, поэтому я хочу убедиться, что после преобразования присутствуют только шесть точек данных (исключая первые и любые данные после седьмой точки данных)

Входные данные:

BANKNIFTY_F1,20150228,15:27,19904.65,19924.00,19900.40,19920.20,31225
BANKNIFTY_F1,20150228,15:28,19921.05,19941.30,19921.05,19937.00,31525
BANKNIFTY_F1,20150228,15:29,19932.45,19945.00,19930.10,19945.00,38275
BANKNIFTY_F1,20150228,15:30,19947.00,19949.40,19930.00,19943.80,43400
BANKNIFTY_F1,20150302,09:16,20150.15,20150.15,20021.50,20070.00,91775,2026525
BANKNIFTY_F1,20150302,09:17,20071.50,20085.00,20063.50,20063.50,45700,2026525

Ожидаемые выходные данные:

[{"date":"20150228","time":"15:27","open":"19904.65","high":"19924.00","low":"19900.40","close":"19920.20","volume":"31225"},{"date": "20150228", "time":"15:28", "open":"19921.05","high":"19941.30" ,"low":"19921.05","close":"19937.00", "volume":"31525"}, {"date":"20150228","time" :"15:29" ,"open": "19932.45" ,"high" :"19945.00 ","low":"19930.10","close" :"19945.00","volume":"38275"},{"date": "20150228","time ":" 15:30","open ":"19947.00","high" :"19949.40","low":"19930.00" ,"close":"19943.80", "volume":"43400"} , {"date": "20150302","time" :"09:16","open":"20150.15","high ":"20150.15", "low":"20021.50", "close":"20070.00 ","volume":"91775"}, {"date":"20150302", "time": "09:17","open": "20071.50", "high":"20085.00" , "low":"20063.50", "close":"20063.50", "volume": "45700"}

Обратите внимание, что в ожидаемом выводе последний ненужный пункт данных, как показано в последних двух входных строках, игнорируется.

Ответы [ 3 ]

2 голосов
/ 02 октября 2019

Вы хотите преобразовать CSV-файл в JSON. При работе с файлами CSV в Python всегда думайте о кадрах данных Pandas. Итак, сначала установите Pandas (pip install pandas).

Считайте файл csv как фрейм данных Pandas, установите заголовки столбцов для ваших ключей, а затем преобразуйте его в json, используя встроенную функциональность Pandas to_dict . Всего несколько строк кода.

Сначала вам нужно будет очистить ненужные строки файла. Если вам нужны только первые X столбцов, также используйте параметры в pd.read_csv для выбора определенных столбцов. Затем сделайте это:

import pandas as pd

dataframe = pd.read_csv("stockdata.txt", header = None, names = ["date","time","open","high","low","close","volume"])

// this is a python dictionary
json_dictionary = dataframe.to_dict('records')

print(json_dictionary)

// optionally convert to a json string
json_string = json_dictionary.dumps()

Вы можете также использовать pd.read_csv , чтобы установить конкретные типы данных для ваших столбцов

0 голосов
/ 02 октября 2019

Вы можете просто сделать это, используя обработку файлов в python.

import json
stocks = []

with open('stocks.txt', 'r') as data:
    for line in data:
        line = line.strip()
        ldata = line.split(',')
        temp_stock = {
            'date':ldata[1],
            'time':ldata[2],
            'open':ldata[3],
            'high':ldata[4],
            'low':ldata[5],
            'close':ldata[6],
            'volume':ldata[7]
        }
        stocks.append(temp_stock)
with open('stocks.json', 'w') as fp:
    json.dump(stocks, fp, indent=4)
from pprint import pprint
pprint(stocks)

Или

with open('stocks.txt', 'r') as data:
    res = [ {
            'date':line.strip().split(',')[1],
            'time':line.strip().split(',')[2],
            'open':line.strip().split(',')[3],
            'high':line.strip().split(',')[4],
            'low':line.strip().split(',')[5],
            'close':line.strip().split(',')[6],
            'volume':line.strip().split(',')[7]
        } for line in data ]

Вывод:

  'date': '20150228',
  'high': '19924.00',
  'low': '19900.40',
  'open': '19904.65',
  'time': '15:27',
  'volume': '31225'},
 {'close': '19937.00',
  'date': '20150228',
  'high': '19941.30',
  'low': '19921.05',
  'open': '19921.05',
  'time': '15:28',
  'volume': '31525'},
 {'close': '19945.00',
  'date': '20150228',
  'high': '19945.00',
  'low': '19930.10',
  'open': '19932.45',
  'time': '15:29',
  'volume': '38275'},
 {'close': '19943.80',
  'date': '20150228',
  'high': '19949.40',
  'low': '19930.00',
  'open': '19947.00',
  'time': '15:30',
  'volume': '43400'},
 {'close': '20070.00',
  'date': '20150302',
  'high': '20150.15',
  'low': '20021.50',
  'open': '20150.15',
  'time': '09:16',
  'volume': '91775'},
 {'close': '20063.50',
  'date': '20150302',
  'high': '20085.00',
  'low': '20063.50',
  'open': '20071.50',
  'time': '09:17',
  'volume': '45700'}]
0 голосов
/ 02 октября 2019

Предполагается, что все строки в текстовом файле построены так же, как вы можете перебирать текстовый файл построчно и разбивать его строго так:

my_tokens = []
for line in f.read():
    tokens = line.split(',')
    my_dict = {}
    try:
        my_dict['date'] = tokens[1]
        my_dict['time'] = tokens[2]
        my_dict['open'] = tokens[3]
        my_dict['high'] = tokens[4]
        my_dict['low'] = tokens[5]
        my_dict['close'] = tokens[6]
        my_dict['volume'] = tokens[7]
    except Exception as:
        continue
    my_tokens.append(my_dict)

Это не самый красивый ответ, ноэто работает с вашим типом данных (:

...