【问题标题】:How to delete specific line from file using python?如何使用python从文件中删除特定行?
【发布时间】:2016-04-14 16:56:55
【问题描述】:

代码为:

from datetime import datetime,time
from csv import reader

with open('onlyOnce.txt', 'r+') as fonlyOnce:
    for f_time, sec_time, dte in filter(None, reader(fonlyOnce, delimiter="_")):

        check_stime=f_time.split(":")
        Stask_hour=check_stime[0]
        Stask_minutes=check_stime[1]
        check_stime = datetime.strptime(f_time,"%H:%m").time()

        check_etime=sec_time.split(":")
        Etask_hour=check_etime[0]
        Etask_minutes=check_etime[1]

        #check every minute if current information = desired information
        now = datetime.now()
        now_time = now.time()
        date_now = now.date()

        if (date_now.strftime("%Y-%m-%d") == dte and time(int(Stask_hour),int(Stask_minutes)) <= now_time <= time(int(Etask_hour),int(Etask_minutes))):
            print("this line in range time: "+ f_time)
            #delete this line
            fonlyOnce.write(" ")
        else:
            print("Padraic Cunningham")
fonlyOnce.close()

这段代码的目标是:

1-循环文件中的行

2-检查当前时间范围内是否有行

3- 如果是:打印this line in range time: 9:1 并从同一文件中删除这一行。

文件中的4-数据为:

7:1_8:35_2016-04-14
8:1_9:35_2016-04-14
9:1_10:35_2016-04-14

5- 输出必须是:

7:1_8:35_2016-04-14
8:1_9:35_2016-04-14

因为最后一行的时间在当前时间范围内,所以必须删除替换空行。

我的问题是这段代码会清理所有文件,我不希望这样:

无效代码:fonlyOnce.write(" ")

谢谢

【问题讨论】:

  • 你有缩进问题,fonlyOnce开头少了一个空格....已经编辑过了。
  • 我认为您尝试就地执行此操作过于复杂。您是否尝试过将要保留的行写到临时文件中,然后在最后用临时文件替换原始文件?

标签: python


【解决方案1】:

我做了什么:
1. 去掉循环判断功能。
2.如果不符合您的需求,请用空列表替换数据
3.打开一个新文件写入处理后的数据

    def IsFit( f_time, sec_time, dte ):
        check_stime=f_time.split(":")
        Stask_hour=check_stime[0]
        Stask_minutes=check_stime[1]
        check_stime = datetime.strptime(f_time,"%H:%m").time()

        check_etime=sec_time.split(":")
        Etask_hour=check_etime[0]
        Etask_minutes=check_etime[1]

        #check every minute if current information = desired information
        now = datetime.now()
        now_time = now.time()
        date_now = now.date()

        if (date_now.strftime("%Y-%m-%d") == dte and time(int(Stask_hour),int(Stask_minutes)) <= now_time <= time(int(Etask_hour),int(Etask_minutes))):
            return False
        else:
            return True

    with open('onlyOnce.txt', 'r+') as fonlyOnce:
        res = [  line if IsFit(*line ) else [] for line in csv.reader(fonlyOnce, delimiter="_") if line ]

    with open(NewFile,'wb') as f:
        wirter = csv.wither(f)
        wirter.writerows(res)

【讨论】:

  • 好的,但是如果我想总是从“onlyOnce.txt”文件中读取,更新数据保存在NewFile中!!
  • @Samah 是的,它已保存到新文件中
  • 那么!!如果我想覆盖!我想重写同一个文件,因为我只想读取它
  • @Samah 如果你想覆盖原始文件,只需将新文件名更改为原始文件名
  • 我编辑了你的代码,但我仍然有错误:Traceback(最近一次调用最后一次):文件“”,第 26 行,在 ValueError:没有足够的值来解包(预期 3,得到 1):
【解决方案2】:

蛮力解决方案 - 适用于小文件

0- 创建行缓冲区

1-循环文件中的行

1.1-检查当前时间范围内是否有行

1.2- 如果是:在时间范围内打印此行:9:1 如果否:将该行添加到缓冲区中

2- 关闭文件进行读取

3- 在缓冲区中添加一个空行

4- 重新打开文件进行写入

5-将缓冲区刷新到文件中,并保存文件

【讨论】:

    【解决方案3】:
    • 您不想编辑正在阅读的文件。这是个坏主意!

    • 相反,您可能需要考虑读取文件的每一行 进入列表,从列表中删除不需要的项目,然后重写 包含此列表的文件。

      但是,如果您的文件很大,这可能会很慢。

      另外,在您的代码末尾您调用fonlyOnce.close(),但您不需要这样做。离开文件后,上下文管理器(with 语句)会自动关闭文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 2023-02-07
      • 2018-06-21
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多