在python中从srt文件(“ Friends”字幕)创建csv文件

时间:2018-12-02 23:36:15

标签: python csv srt

当前,我正在尝试创建一个包含NBC的“朋友”字幕及其相应开始时间的csv文件。因此,基本上我正在尝试将srt文件转换为python中的csv文件。

对于那些不熟悉srt文件的人,它们看起来像这样:

1
00:00:47,881 --> 00:00:49,757
[CAR HORNS HONKING]

2
00:00:49,966 --> 00:00:52,760
There's nothing to tell.
It's just some guy I work with.

3
00:00:52,969 --> 00:00:55,137
Come on.
You're going out with a guy.

…

现在我已经使用readlines()将其变成这样的列表:

['\ufeff1\n', '00:00:47,881 --> 00:00:49,757\n', '[CAR HORNS HONKING]\n',
'\n', '2\n', '00:00:49,966 --> 00:00:52,760\n',
"There's nothing to tell.\n", "It's just some guy I work with.\n",
'\n', '3\n', '00:00:52,969 --> 00:00:55,137\n', 'Come on.\n',
"You're going out with a guy.\n", ...]

是否有一种方法可以从此列表(或其所基于的文件)创建包含开始时间(不需要结束时间)和所属行的字典或数据框。我一直在努力,因为虽然有时只有一行对应于开始时间,但有时却有两行(此文件中每个开始时间最多有两行。但是,可以使用一种解决方案,以防出现更多行最好)。

看起来像第一个(“ [CAR HORNS HONKING]”)的行或其他仅说e的行。 G。理想情况下,不包括“ CHANDLER:”及其开始时间,但现在并不是那么重要。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为这段代码可以解决您的问题。主要思想是使用正则表达式来定位每个图例的开始时间,并提取其值和相应的行。该代码不是最完美的形式,但是我认为主要思想已经很好地表达了。希望对您有所帮助。

import re

with open('sub.srt', 'r') as h:
    sub = h.readlines()

re_pattern = r'[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3} -->'
regex = re.compile(re_pattern)
# Get start times
start_times = list(filter(regex.search, sub))
start_times = [time.split(' ')[0] for time in start_times]
# Get lines
lines = [[]]
for sentence in sub:
    if re.match(re_pattern, sentence):
        lines[-1].pop()
        lines.append([])
    else:
        lines[-1].append(sentence)
lines = lines[1:]         

# Merge results
subs = {start_time:line for start_time,line in zip(start_times, lines)}