#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)