Для каждой новой строки сохраняйте в json

#python #json #python-3.x

#python #json #python-3.x

Вопрос:

Мой вопрос может быть запутанным.

Я хочу превратить это:

 Package: me.sukarodo.isupervisor
Section: Utilities
Maintainer: Sukarodo <sukarodo@protonmail.com>
Architecture: iphoneos-arm
Version: 1.0
Description: Supervises your iDevice
Name: iSupervisor (Supervision)
Filename: ./debs/me.sukarodo.isupervisor_1.0_iphoneos-arm.deb
Size: 1094
  

В это:

 {
    "url" : "{url}",
    "apps" : [{
        "deb_name" : "DEB NAME",
        "section" : "section",
        "version" : "version",
        "download" : "https://blah"
    },{

        "app_name" : "APP NAME",
        "section" : "section",
        "version" : "version",
        "download" : "https://blah"
    }]
}
  

Код, который у меня сейчас есть, это:

 
# REMOVES DATA FOLDER
shutil.rmtree("data")
os.mkdir("data")
url = "https://repo.crafterpika.tk/"
print(f"Downloading from {url}")
try:
  wget.download(f'{url}/Packages.bz2', './data/Packages.bz2')
except Exception as e:
  print(f"Is this a repo? Error: {e}")
  sys.exit("Quit ")
  
zipfile = bz2.BZ2File("./data/Packages.bz2")
data = zipfile.read()
filepath = "repo"
open(filepath, 'wb').write(data)

f = open(filepath).read()
print("n")
print("Downloading the following Packages:")
print(convert(re.findall(r'(?:Name: )(.*)', f)))
print("")
print("")
ipas = convert(re.findall(r'(?:Filename: )(.*)', f))
ipas = ipas.replace('./', f'{url}')
downloads = ipas.replace(' ', 'n')
print(downloads)
  

Код, который у меня есть в настоящее время, работает при печати, но я понятия не имею, как я мог бы превратить его в полностью функционирующий json, как я показал выше. Я пытаюсь сделать это для своего сайта, и было бы здорово, если бы кто-то, кто знает больше о python, мог мне помочь

Ответ №1:

Все, что вам нужно, это python по умолчанию csv и json .

Простой пример для json

 import json

data = {
   'key1': [1, 'a'],
   'key2': 'some text',
}

# encodes the data into json format (output type: string)
json_encoded = json.dumps(data)

# decodes json formatted string into python (output type: depends on json string)
json_decoded = json.loads(json_encoded)
  

Чисто на основе структуры данных в файле с именем repo

Поскольку вам нужно только создать строку в формате json: прочитайте csv-файл и создайте словарь с ключами «url» и «приложения». Значение ключа «приложения» представляет собой список словарей, содержащих данные каждого пакета.

 import csv
import json

# rest of the code

zipfile = bz2.BZ2File("./data/Packages.bz2")
data = zipfile.read()

# write the contents to csv file since we have a specific text format
# the format of each line being > label: value
# using csv format for reading each line's easily rather than by using regex
filepath = "repo.csv" 
open(filepath, 'wb').write(data)


# create final data to be converted to json formatted string
final_data = {
'url': '',
'app': [],
}
app = {}

# open csv file and read using : as the delimiter
# which would give each line as a list of label and value
with open('repo.csv') as csvfile:
    data = csv.reader(csvfile, delimiter=':')
    for line in data:
        # each application data is seperated by a blank line in the file
        # which means after this line, the next line would contains details of the next app
        # add the current app details dictionary to the app list
        if len(line) == 0:
            final_data['app'].append(app)
            app = {}
            continue

        # since we are delimiting by :, links would also be seperated.
        # stitch them back to one
        if line[1].strip() in ['http', 'https']:
            line[1] = line[1]   ':'   line[2]  
        
        # create dictionary key values for the current app
        app[line[0]] = line[1].strip()


# use final_data for other operations

# convert to json string
json_string = json.dumps(final_data)

  
 # print(final_data)
{
'url': '',
'app': [
    {'Architecture': 'iphoneos-arm',
          'Depiction': 'https://crafterpika.github.io/repo/description.html?id=me.sukarodo.isupervisor',
          'Description': 'Supervises your iDevice',
          'Filename': './debs/me.sukarodo.isupervisor_1.0_iphoneos-arm.deb',
          'Installed-Size': '64',
          'MD5sum': 'c2c6ca572846a529f6f0278525493cef',
          'Maintainer': 'Sukarodo <sukarodo@protonmail.com>',
          'Name': 'iSupervisor (Supervision)',
          'Package': 'me.sukarodo.isupervisor',
          'Priority': 'standard',
          'SHA1': '163084f7229308fbe5e8e530f28bc171c4a2825b',
          'SHA256': '0c6b16eae9cdaaddfc01c340bf1840b4c782bd67b9809713855fbe45ce8c7898',
          'Section': 'Utilities',
          'Size': '1094',
          'Version': '1.0'},
    # data of other apps
    ]
}
  

Для сохранения в файл json:

 import json

# to save the data to a json file
with open('final_data.json', 'w') as json_file:
  json.dump(final_data, json_file)

  

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

1. @DwifteJB используйте json.dump() для записи в файл json.

2. Готово! Однако у меня проблема с репозиториями, из которых я загружаю, они используют ./ вместо URL. Как я мог преобразовать ./ в {url} в скрипте?

3. @DwifteJB либо вы можете создать URL-адрес во внешнем интерфейсе при разборе этого файла json, либо вы можете проверить наличие соответствующего ключа в final_data (конечно, вам нужно выполнить цикл через final_data[‘app’]). Если этот ключ найден, обновите это значение ключа, заменив ‘./’ на url (при условии, что структура URL-адреса> url / filename)