【问题标题】:Replace every third line in a text file with content from another text file将文本文件中的每三行替换为另一个文本文件中的内容
【发布时间】:2019-08-31 04:27:13
【问题描述】:

尝试用实际的字幕替换每三行。

背景:我在 Videosubfinder 和 ocr api 的帮助下为音乐视频和电影制作字幕。

emptySub.srt(使用 Videosubfinder 自动创建)

1
00:00:10,076 --> 00:00:15,080
sub duration: 5,004

2
00:00:57,891 --> 00:01:01,694
sub duration: 3,803

subtitle.txt 是这样的(使用了ocr api,循环图片,不需要看代码)

I bought some eggs.
He bought some spam.

代码

with open("empty.srt", "a") as file:
    for line in file:
        # TODO

预期输出

1
00:00:10,076 --> 00:00:15,080
I bought some eggs.

2
00:00:57,891 --> 00:01:01,694
He bought some spam.

我被困住了。如何用我的字幕替换?也许我应该使用我不知道的正则表达式。

编辑:我终于自己解决了

【问题讨论】:

  • 预期输出?我没明白你说的是哪条第三行
  • 此行子持续时间:5,004。每一行都说子持续时间。哦,只有第一次这是我的错误的第三行。然后每次似乎都是第四行。
  • 您的 Python“尝试”并没有展示出任何实际的努力;这只是一个“给我代码”的问题。投票结束的范围太广。
  • 我只是个初学者。
  • 请添加您自己的解决方案作为答案,而不是作为问题的编辑。我正在投票重新提出问题,以便您可以这样做。

标签: python python-3.x text-files readline


【解决方案1】:

你想要一些变体:

subtitleLines = open('subtitle.txt', 'r')

# Creates a list of lines
srtLines = open('srtfile.srt', 'r').readlines()

for (i, line) in enumerate(subtitleLines):
  srtLines[3*i + 2] = line

# emit srtLines

这对于 KB 到 ~MBish 范围内的文件表现良好,但如果文件很大,您将希望推进 srt file 比字幕 file 更快。你如何推进一个打开的文件?拨打next():

# after reading in subtitle.txt into subtitleFile:
for line in subtitleFile:
  for i in range(2):
    # Your "next" line will have a newline, so suppress print()'s
    # default newline.
    print(srtFile.next(), end="")
  # advance without printing
  srtFile.next()
  print line

您将需要捕获StopIteration 并决定在 SRT 文件“用完”后做什么 - 这取决于您是否要验证。

但是请注意,从您的示例来看,从第 3 行开始的每 4 行似乎都是字幕行(srt 块之间有一个空白行)。

【讨论】:

  • 我以前从未使用过枚举
  • enumerate 接受一个“可迭代”对象(基本上是一个您可以按顺序遍历的对象,并产生当前发出的项目数加上发出的项目:(0, line0), ( 1, line1), (2, line2), ... 如果您同时需要值和索引(因为您可能在另一种语言中使用标准 for 循环),这将非常有用。
  • 未定义字幕文件
  • 是的,subtitleFile是调用open('path/to/subtitle.txt', 'r')得到的文件句柄。我没想过要把那部分写出来,因为看起来你对打开文件很熟悉。我在代码中添加了注释
  • srtFile 没有属性'next'
【解决方案2】:
subList = []
with open("subtitle.txt", "r") as subFile:
    for subLine in subFile:
        subList.append(subLine.rstrip())

print(subList)

i = 0
with open("emptySub.srt", "r") as file:
    for line in file:
        if line.startswith('s'):
            line = line.replace(line, subList[i]+'\n')
            i = i + 1
        with open('newFile.srt','a') as resFile:
            resFile.write(line)

【讨论】:

  • 您可能不想在for 循环的每个滴答声中调用with open('newFile.srt','a') as resFile:(尽管python/操作系统可能会对此进行优化);您可以移动该行,使两个 with open 调用彼此相邻,并且您只打开每个文件一次。
猜你喜欢
  • 1970-01-01
  • 2020-05-27
  • 2011-02-11
  • 2018-03-29
  • 2018-12-27
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多