如何用python查找和替换json文件中的特定字符串

Posted

技术标签:

【中文标题】如何用python查找和替换json文件中的特定字符串【英文标题】:How to find and replace a specific string in a json file with python 【发布时间】:2022-01-11 03:39:59 【问题描述】:

使用python程序,我将一个ics文件保存到一个json文件中。json文件包含日历信息。我的目的是用不同的字符串(关键字)替换一些特定的字符串(小时)。基本上是 8:00 到 Meeting1 ; 9:00 到会议 2,以此类推。 Json 内容看起来像这样11/18/21 09:00 UTC-12/19/25 09:45 UTC Meeting-boss: - None。这由 python 程序完成可能会很痛苦,所以我必须使用它。这是将 ics 文件解析为 json 文件的 python 程序:


from datetime import datetime, timedelta, timezone
import icalendar
from dateutil.rrule import *
f = open('myschool.json', 'w')

def parse_recurrences(recur_rule, start, exclusions):
    """ Find all reoccuring events """
    rules = rruleset()
    first_rule = rrulestr(recur_rule, dtstart=start)
    rules.rrule(first_rule)
    if not isinstance(exclusions, list):
        exclusions = [exclusions]
        for xdate in exclusions:
            try:
                rules.exdate(xdate.dts[0].dt)
            except AttributeError:
                pass
    now = datetime.now(timezone.utc)
    this_year = now + timedelta(days=60)
    dates = []
    for rule in rules.between(now, this_year):
        dates.append(rule.strftime("%D %H:%M UTC "))
    return dates

icalfile = open('myschool.ics', 'rb')
gcal = icalendar.Calendar.from_ical(icalfile.read())
for component in gcal.walk():
    if component.name == "VEVENT":
        summary = component.get('summary')
        description = component.get('description')
        location = component.get('location')
        startdt = component.get('dtstart').dt
        enddt = component.get('dtend').dt
        exdate = component.get('exdate')
        if component.get('rrule'):
            reoccur = component.get('rrule').to_ical().decode('utf-8')
            for item in parse_recurrences(reoccur, startdt, exdate):
                print("0 1: 2 - 3\n".format(item, summary, description, location), file = f)
        else:
            print("0-1 2: 3 - 4\n".format(startdt.strftime("%D %H:%M UTC"), enddt.strftime("%D %H:%M UTC"), summary, description, location), file = f)
icalfile.close()

我不知道该怎么做。如果它使事情变得更容易顺便说一句,json 可能是一个 txt 文件。 感谢所有帮助:)

【问题讨论】:

【参考方案1】:

我想你可以使用"re"包(python正则表达式)来做,然后你可以使用replace方法将目标字符串替换为需要的字符串

您可以在此处https://docs.python.org/3/library/re.html

阅读有关 re 模块 的更多信息

而且这个网站真的会帮你搜索JSON文件并找到目标字符串https://pythex.org/

【讨论】:

【参考方案2】:

如果在当前 json 输出以及预期的 json 输出旁边没有示例 icalendar 组件,您的代码有点难以理解。如果我正确解释了您的代码,那么您似乎正在通过使用 component.get() 格式化从 icalendar 组件检索到的数据来构建 json。如果这是正确的,当您第一次从日历文件。然后,您可以按照当前的方式从字符串中组装 json,因为您想要进行的更改将在构建 json 文件之前完成。

例如:如果 startdt = component.get('dtstart').dt 包含从 icalendar 提取的对应于“11/18/21 09:00”的字符串,则可以使用正则表达式或字符串拆分之类的方法来删除“09:00”并添加“会议 2”。一旦变量 startdt 被修改为拥有你想要的数据,你的 json 就应该继承这些变化。

假设 startdt 包含为您的 json 提供日期和时间的字符串(例如:“11/18/21 09:00”),您可以使用以下代码将字符串更改为“11/18/21 Meeting 2” .

# import regex library
import re

# takes place of startdt = component.get('dtstart').dt in your code to make example easier.
startdt = "11/18/21 09:00"

# uses regex patter that looks for 2 digits, then ":" followed by 2 digits,
#then replaces the string that matches that pattern with "Meeting 2"
startdt = startdt.replace(re.search('\d2:\d2', startdt)[0], "Meeting 2")

print(startdt)

您没有指定如何在替换期间决定如何命名每个会议,但您可以将任何您想要的名称传递给 startdt.replace() 行,而不是示例中的硬编码“会议 2”。

【讨论】:

以上是关于如何用python查找和替换json文件中的特定字符串的主要内容,如果未能解决你的问题,请参考以下文章

字符串操作:如何用特定模式替换字符串

如何用Python语言实现在一个文件中查找特定的字符串?

Bash 脚本:如何用 sed 替换 package.json 中的文本

如何用Python来进行查询和替换一个文本字符串

如何用批处理替换文本内容?

如何用相同长度的唯一数字替换特定长度的字符