Замените . с _ в файле json и запишите его в таблицу с помощью python

#python #json #database

#python #json #База данных

Вопрос:

Как заменить . с помощью _ в моем файле json и отправьте результирующий файл json в таблицу DB.

Пробовал приведенный ниже код, но не работает:

 import pandas as pd
import json
import sys
import os
import psycopg2
import glob
import traceback
import csv

user= sys.argv[2]
password = sys.argv[3]
host = sys.argv[4]
port = sys.argv[5]
db = sys.argv[6]
documenttype = sys.argv[7]
schema_name =  sys.argv[8]

from sqlalchemy import create_engine

engine = create_engine('postgresql psycopg2://' user ':' password '@' host ':' port '/' db)
print("Database is connected")

data = sys.argv[1]
output_path = sys.argv[9]
for fileName in os.listdir(data):
    file = open(data fileName, "r",encoding='utf-8')
    contents = file.read()
    if '.' in contents:        
        with open(output_path fileName,'w',encoding='utf-8') as output:
            rmSplc=contents.replace('.','_')
            output.write(rmSplc)
            print(". replaced with _ in file")


df = pd.read_json(rmSplc)

df['RecordsNew'] = df['Records'].astype('|S80')

df_1 = pd.json_normalize(df['Records'])
df_1.columns = map(str.lower, df_1.columns)
table_name =documenttype.lower()

             
df_1.to_sql(table_name,schema=schema_name,con=engine, if_exists = 'append',index=False)
  

Но получаю ошибку ниже:

 Database is connected
Traceback (most recent call last):
  File "/xdata/dev/ariba/python/JSON_PYTHON_RESPONSE.py", line 36, in <module>
    for fileName in os.listdir(data):
OSError: [Errno 36] File name too long: '{"Records":[{"ExceptionType":{"ExceptionTypeId":"UnderTaxVariance-SAP"},"InvoiceLineNumber":2,"ExceptionStatus":"Unreconciled","InvoiceSubmissionMethod":"PaperInvoice","AccountingDate":{"Day":"2020-02-19T00:00:00Z"},"OrderID":null,"InvoiceId":"IRC2347-R337-154","InvoiceWithExceptionCount":1,"Requester":{"SourceSystem":"SSP-sap-CHILD1","UserId":"","PasswordAdapter":""},"Supplier":{"SourceSystem":"SSP-sap-CHILD1","SupplierId":"sid111","SupplierLocationId":"sid111_loc1"},"InvoiceNumber":"C2347-R337","InvoiceDate":{"Day":"2020-02-20T00:00:00Z"},"IRStatus":"Reconciling","POId":null,"ReconciledBy":{"SourceSystem":"SSP-sap-CHILD1","UserId":"","PasswordAdapter":""},"LoadUpdateTime":"2020-02-19T19:27:38Z","ProcurementUnit":{"SourceSystem":"","UniqueName":""},"LoadCreateTime":"2020-02-19T19:27:38Z","InvoiceSourceDocument":"NoOrderInformation","POLineNumber":null,"SourceSystem":{"SourceSystemId":"SSP-sap-CHILD1"}}],"PageToken":"TlhXQ0FXVDJHMUV3Qg"}'
InvoiceExceptionsFactis created
ProjectFactSystemView
ProjectFact
  

Пример Json:

 {"Records":[{"CommodityId":"3470","SourceSystem":"SSP-generic-CHILD4","CommodityName":"ANCHOR BOLTS - BILL OF MATERIALS","CommodityType":""},
{"CommodityId":"468657","SourceSystem":"SSP-generic-CHILD4","CommodityName":"COOLING INSERT","CommodityType":""},
{"CommodityId":"836519","SourceSystem":"SSP-generic-CHILD4","CommodityName":"DIAPHRAGM 2ND STAGE PGT25","CommodityType":""},
{"CommodityId":"807525","SourceSystem":"SSP-generic-CHILD4","CommodityName":"MOBILE NOZZLE MACHINING 2ST MS5002C(S2N)","CommodityType":""},
{"CommodityId":"DEFAULT","SourceSystem":"SSP-sap-BH100","CommodityName":"DEFAULT ERP Commodity Code","CommodityType":""},
{"CommodityId":"0074","SourceSystem":"SSP-sap-BH100","CommodityName":"Parts for equip,mach","CommodityType":""},
{"CommodityId":"B14","SourceSystem":"SSP-sap-BH100","CommodityName":"Glycols amp; Glycol Eth","CommodityType":""},
{"CommodityId":"CSU","SourceSystem":"SSP-sap-BH100","CommodityName":"SPRINGS","CommodityType":""}],"PageToken":"TlhXQ0FVcTlzNE8rQQ"}
  

Если я удалю фрагмент кода для замены. с _ он работает нормально.
Данные считываются, таблица создается, и данные также передаются в таблицу.
Но хотите заменить . в _, а затем запишите его в таблицу.
Предложения по решению этой проблемы окажут большую помощь.

Комментарии:

1. Но в чем именно проблема? И не могли бы вы добавить пример содержимого json.

2. Пример содержимого JSON: {"Records":[{"CommodityId":"3470","SourceSystem":"SSP-generic-CHILD4","CommodityName":"ANCHOR BOLTS - BILL OF MATERIALS","CommodityType":""}, {"CommodityId":"DEFAULT","SourceSystem":"SSP-sap-BH100","CommodityName":"DEFAULT ERP Commodity Code","CommodityType":""}, {"CommodityId":"CSU","SourceSystem":"SSP-sap-BH100","CommodityName":"SPRINGS","CommodityType":""}],"PageToken":"TlhXQ0FVcTlzNE8rQQ"}

3. Ошибка, которую я получаю: Database is connected Traceback (most recent call last): File "/xdata/dev/ariba/python/JSON_PYTHON_RESPONSE.py", line 42, in <module> for fl in glob.iglob(df_1): File "/usr/local/anaconda3/lib/python3.6/glob.py", line 40, in _iglob dirname, basename = os.path.split(pathname) File "/usr/local/anaconda3/lib/python3.6/posixpath.py", line 107, in split p = os.fspath(p) TypeError: expected str, bytes or os.PathLike object, not DataFrame InvoiceExceptionsFactis created ERPCommodityDimSystemView ERPCommodityDim

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

5. Да, спасибо за предложение, обновил вопрос как с ошибкой, так и с образцом файла json. Необходимый сценарий: данные должны быть прочитаны, если «.» найдено, то его следует заменить на «_», а затем перенести в таблицу.

Ответ №1:

если замена — единственная проблема в вашем коде, попробуйте это:

 # -*- coding: utf-8 -*-
import os
input_path='E:/CD034591Q_001log5.json'
output_path='E:/CD034591Q_001log5.json' 

file = open(input_path, "r",encoding='utf-8')
contents = file.read()
if '' in contents:        
    with open(output_path,'w',encoding='utf-8') as output:
        rmSplc=contents.replace('','')
        output.write(rmSplc)
  

Комментарии:

1. Я попытался включить ваш код, но каким-то образом получил ошибку, в которой указано слишком длинное имя файла (обновил мой вопрос). Данные должны быть прочитаны, если «.» найдено, тогда его следует заменить на «_», а затем перенести в таблицу. Не уверен, где я ошибся, пожалуйста, помогите

2. @Roho код, который я упомянул выше для набора файлов JSON, размещенных в одной папке, fileName в цикле for (5-я строка) — это файлы из папки, взятые один за другим (например: file1.json, file2.json … и т. Д.). если вы хотите запустить только для одного файла, простоукажите путь и запустите его с (6-я строка), просто откройте файл, прочитайте и замените его. os.listdir для чтения нескольких файлов, размещенных в одной папке, здесь заголовок json принимает имя файла, если вы все еще не поняли, пожалуйста, укажите это, я отредактируюмой код

3. Manju, я все еще не могу его получить. Пожалуйста, вы можете отредактировать свой код. Было бы очень полезно

4. @Roho, отредактированный, просто укажите входной и выходной файл так же, как указано выше