使用 python 更改类型

问题描述 投票:0回答:1

我有以下字符串:

x = "[(7, 'N°001C/MITP/CAB/UGP-BAD/2023 Du 30/01/2024', 'Recrutement d’une ONG/Firme pour les services d’accompagnement social,\r communication, sensibilisation des populations de la zone du projet d’Aménagement et de bitumage de la route\r Lola- Frontière de la Cote d’Ivoire', 'Sensibilisation', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 22), None, datetime.date(2024, 2, 5), 2), (9, 'N°001/MPFPV/PERSIF/UCP/2024', 'Mission d’audit des comptes du PERSIF. Exercices 2023 et 2024\r(l’audit de clôture inclus)', '', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 9), None, datetime.date(2024, 2, 5), 2)]"

这是当客户端发送请求时服务器发送给我的响应。我怎样才能将这串字符转换为可用的数据,即:

x = [(7, 'N°001C/MITP/CAB/UGP-BAD/2023 Du 30/01/2024', 'Recrutement d’une ONG/Firme pour les services d’accompagnement social,\r communication, sensibilisation des populations de la zone du projet d’Aménagement et de bitumage de la route\r Lola- Frontière de la Cote d’Ivoire', 'Sensibilisation', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 22), None, datetime.date(2024, 2, 5), 2), (9, 'N°001/MPFPV/PERSIF/UCP/2024', 'Mission d’audit des comptes du PERSIF. Exercices 2023 et 2024\r(l’audit de clôture inclus)', '', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 9), None, datetime.date(2024, 2, 5), 2)]

元组列表

python request
1个回答
0
投票

您可以使用

eval
,但如果攻击者控制字符串 x,则这是不安全的:攻击者随后可以在您的计算机上运行他们选择的任何代码。使用
ast.literal_eval
是安全的,但它不支持
datetime

这是一个肮脏的黑客,它将

datetime.date
构造函数转换为字符串:

import ast
import datetime
import re

x = r"[(7, 'N°001C/MITP/CAB/UGP-BAD/2023 Du 30/01/2024', 'Recrutement d’une ONG/Firme pour les services d’accompagnement social,\r communication, sensibilisation des populations de la zone du projet d’Aménagement et de bitumage de la route\r Lola- Frontière de la Cote d’Ivoire', 'Sensibilisation', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 22), None, datetime.date(2024, 2, 5), 2), (9, 'N°001/MPFPV/PERSIF/UCP/2024', 'Mission d’audit des comptes du PERSIF. Exercices 2023 et 2024\r(l’audit de clôture inclus)', '', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 9), None, datetime.date(2024, 2, 5), 2)]"
if 0:
  x = eval(x, {'datetime': datetime})  # Unsafe.
else:
  x = re.sub(r'\b(datetime[.]date\([\d, ]+\))', r"'\1'", x)  # Safe.
  x = ast.literal_eval(x)  # Safe.
print(x)

datetime.date
的正确解析器是可行的,但更复杂。您可以从 tokenize 模块开始:

import tokenize
x = r"[(7, 'N°001C/MITP/CAB/UGP-BAD/2023 Du 30/01/2024', 'Recrutement d’une ONG/Firme pour les services d’accompagnement social,\r communication, sensibilisation des populations de la zone du projet d’Aménagement et de bitumage de la route\r Lola- Frontière de la Cote d’Ivoire', 'Sensibilisation', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 22), None, datetime.date(2024, 2, 5), 2), (9, 'N°001/MPFPV/PERSIF/UCP/2024', 'Mission d’audit des comptes du PERSIF. Exercices 2023 et 2024\r(l’audit de clôture inclus)', '', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 9), None, datetime.date(2024, 2, 5), 2)]"
print(list(tokenize.tokenize(iter((x.encode('utf-8'), b'')).__next__)))  # Safe.
© www.soinside.com 2019 - 2024. All rights reserved.