Python 在不丢失可读性的情况下,将特殊字符转换为类似ascii的字符或其他字符

Python 在不丢失可读性的情况下,将特殊字符转换为类似ascii的字符或其他字符,python,unicode,ascii,Python,Unicode,Ascii,尝试将ics日历文件中的数据格式化为任何输出,如json,甚至pythonprint()。正在寻找替换特殊字符的好方法,同时又不丢失可读性和类似ascii的字符。下面的例子。有什么建议吗 ics文件中的摘要字段值 FORMULA 1 HEINEKEN GRANDE PRÉMIO DE PORTUGAL 2021 - Race FORMULA 1 MYWORLD GROSSER PREIS VON ÖSTERREICH 2021 - Race json文件中的摘要键值 FORMULA 1 HEI

尝试将ics日历文件中的数据格式化为任何输出,如json,甚至python
print()
。正在寻找替换特殊字符的好方法,同时又不丢失可读性和类似ascii的字符。下面的例子。有什么建议吗

ics文件中的摘要字段值

FORMULA 1 HEINEKEN GRANDE PRÉMIO DE PORTUGAL 2021 - Race
FORMULA 1 MYWORLD GROSSER PREIS VON ÖSTERREICH 2021 - Race
json文件中的摘要键值

FORMULA 1 HEINEKEN GRANDE PR\u00c3\u0089MIO DE PORTUGAL 2021 - Race
FORMULA 1 MYWORLD GROSSER PREIS VON \u00c3\u0096STERREICH 2021 - Race
重现问题的示例代码

import requests
import json
from icalendar import Calendar

## LOGIC HERE ##
def format_text(text):
    text = str(text)
    return text


url = "http://www.formula1.com/calendar/Formula_1_Official_Calendar.ics"
res = requests.get(url)
calendar = Calendar.from_ical(res.text)
events = [
    {
        "id": event["UID"].split("@")[-1].strip(),
        "startTime": event["DTSTART"].dt.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3],
        "summary": format_text(event["SUMMARY"])
    } for event in calendar.walk("VEVENT") if str(event["UID"]).split("@")[0].startswith("Race")]


with open("events.json", "w") as f:
    json.dump(events, f, indent=2)
发件人:

如果
确保_ascii
为true(默认值),则保证输出为 对所有传入的非ASCII字符进行转义如果
确保使用ascii
false,这些字符将按原样输出。

使用
open
中的
encoding=“utf-8”
作为

发件人:

如果
确保_ascii
为true(默认值),则保证输出为 对所有传入的非ASCII字符进行转义如果
确保使用ascii
false,这些字符将按原样输出。


使用
open
中的
encoding=“utf-8”
作为。

不应解码.ics文件的数据,而应直接从传递到
。改用
res.content
。然后,
Calendar
生成正确解码为UTF-8(可能是.ICS规范的一部分)的数据,
print
可以正确打印Unicode字符串。对于JSON,使用
utf8
编码和
确保_ascii=False
编写,正如@JosefZ建议的那样,以正确地查看它:

导入请求
导入json
从icalendar导入日历
url='1〕http://www.formula1.com/calendar/Formula_1_Official_Calendar.ics'
res=requests.get(url)
日历=日历。从日历(内容)
事件=[
{
“id”:事件['UID'].split('@')[-1].strip(),
“开始时间”:事件['DTSTART'].dt.strftime(“%Y-%m-%dt%H:%m:%S.%f”)[:-3],
“摘要”:事件[“摘要”]
}对于calendar.walk('VEVENT')中的事件,如果str(事件['UID')).split('@')[0]。startswith('Race')]
对于事件中的事件:
打印(事件['summary'])
将open('events.json','w',encoding='utf8')作为f:
dump(事件,f,确保ascii=False,缩进=2)
打印
输出:

2021年一级方程式海湾航空巴林大奖赛-比赛
意大利制造的一级方程式倍耐力GRAN PREMIO DEL E DELL'EMILIA ROMAGNA 2021-比赛
2021年葡萄牙普雷米奥一级方程式喜力大赛车-比赛
2021年一级方程式阿美大赛车-比赛
2021年摩纳哥一级方程式大奖赛-比赛
2021年一级方程式阿塞拜疆大奖赛-比赛
2021年一级方程式喜力加拿大大奖赛-比赛
2021年一级方程式酋长国法国大奖赛-比赛
2021年一级方程式赛车世界杯总冠军PREIS VONÖSTERREICH-比赛
2021年一级方程式倍耐力英国大奖赛-比赛
一级方程式马格亚尔-纳吉德2021-比赛
2021年一级方程式劳力士比利时大奖赛-比赛
2021年一级方程式喜力荷兰大奖赛-比赛
2021年一级方程式喜力格兰普雷米奥意大利站-比赛
2021年一级方程式VTB俄罗斯大奖赛-比赛
一级方程式新加坡航空公司2021年新加坡大奖赛-比赛
2021年一级方程式日本大奖赛-比赛
2021年一级方程式阿美美国大奖赛-比赛
2021年墨西哥城一级方程式赛车-比赛
2021年一级方程式喜力大圣保罗站比赛
2021年一级方程式劳力士澳大利亚大奖赛-比赛
2021年一级方程式沙特阿拉伯大奖赛-比赛
2021年阿布扎比一级方程式埃提哈德航空大奖赛-比赛
events.json:

[
{
“id”:“1064”,
“开始时间”:“2021-03-28816:00:00.000”,
“概述”:“2021年海湾航空巴林大奖赛一级方程式-比赛”
},
{
“id”:“1065”,
“开始时间”:“2021-04-18T14:00:00.000”,
“小结”:“意大利制造的一级方程式倍耐力格兰普雷米奥-德尔2021年比赛”
},
{
“id”:“1066”,
“开始时间”:“2021-05-02T15:00:00.000”,
“概述”:“2021年葡萄牙普雷米奥一级方程式喜力大赛车-比赛”
},
{
“id”:“1086”,
“开始时间”:“2021-05-09T14:00:00.000”,
“总结”:“2021年一级方程式阿美格兰普雷米奥埃斯帕尼亚-比赛”
},
{
“id”:“1067”,
“开始时间”:“2021-05-23T14:00:00.000”,
“概述”:“2021年摩纳哥一级方程式大奖赛-比赛”
},
{
“id”:“1068”,
“开始时间”:“2021-06-06T13:00:00.000”,
“概述”:“2021年阿塞拜疆一级方程式大奖赛-比赛”
},
{
“id”:“1069”,
“开始时间”:“2021-06-13T19:00:00.000”,
“概述”:“2021年加拿大一级方程式喜力大奖赛-比赛”
},
{
“id”:“1070”,
“开始时间”:“2021-06-27T14:00:00.000”,
“概述”:“2021年一级方程式酋长国法国大奖赛-比赛”
},
{
“id”:“1071”,
“开始时间”:“2021-07-04T14:00:00.000”,
“概述”:“2021年一级方程式赛车世界杯总冠军普雷斯冯奥斯特雷希-比赛”
},
{
“id”:“1072”,
“开始时间”:“2021-07-18T15:00:00.000”,
“概述”:“2021年倍耐力一级方程式英国大奖赛-比赛”
},
{
“id”:“1073”,
“开始时间”:“2021-08-01T14:00:00.000”,
“总结”:“一级方程式马格亚尔-纳吉德2021-比赛”
},
{
“id”:“1074”,
“开始时间”:“2021-08-29T14:00:00.000”,
“概述”:“2021年一级方程式劳力士比利时大奖赛-比赛”
},
{
“id”:“1075”,
“开始时间”:“2021-09-05T14:00:00.000”,
“概述”:“2021年一级方程式喜力荷兰大奖赛-比赛”
},
{
“id”:“1076”,
“开始时间”:“2021-09-12T14:00:00.000”,
“概述”:“2021年喜力大普莱米奥意大利方程式赛车”
},
{
“id”:“1077”,
“开始时间”:“2021-09-26T13:00:00.000”,
“概述”:“2021年俄罗斯VTB一级方程式大奖赛-比赛”
},
{
“id”:“1078”,
“开始时间”:“2021-10-03T13:00:00.000”,
“概述”:“新加坡航空公司2021年一级方程式新加坡大奖赛-比赛”
},
{
“id”:“1079”,
“开始时间”:“2021-10-10T06:00:00.000”,
“概述”:“2021年一级方程式日本大奖赛-比赛”
},
{
“id”:“1080”,
“开始时间”:“2021-10-24T20:00:00.000”,
“概述”:“2021年一级方程式阿美美国大奖赛-比赛”
},
with open("events.json", mode="w", encoding="utf-8") as f:
    json.dump(events, f, indent=2, ensure_ascii=False)