c********l 发帖数: 8138 | 1 实在不习惯啊,必须要用range来walk around | E*****m 发帖数: 25615 | | p*****2 发帖数: 21240 | 3
我上次不是给过例子吗?
【在 E*****m 的大作中提到】 : 什麼情況下這樣比較不好呢?
| E*****m 发帖数: 25615 | 4
我看漏了,或者忘了。 有連接嗎?
【在 p*****2 的大作中提到】 : : 我上次不是给过例子吗?
| N******K 发帖数: 10202 | 5 matlab语言就是这样 非常好 我喜欢
【在 c********l 的大作中提到】 : 实在不习惯啊,必须要用range来walk around
| p**o 发帖数: 3409 | 6 你给个具体的需求,我帮你改一改,看会不会比你的walkaround好一点
【在 c********l 的大作中提到】 : 实在不习惯啊,必须要用range来walk around
| c********l 发帖数: 8138 | 7 好的,多谢!!!
小弟这里有一些网上下载下来的srt字幕文件,
这些字幕文件在里面不知道为什么加入了多余的回车换行,导致看起来十分吃力
我想把多余的换行去掉,保证每组字幕显示只出现在单行
.srt文件的定义:
每组字幕在源文件中占据N行:
第一行是index
第二行是两个时间,中间用“-->”连接
第三行到第N-1行是字幕
第N行是空行
在java下,源文件可以被换行split成一个数组
然后用for (int i=0; i
因为在读前面的时候,后面哪一行“即第N行”才是空行中,N是未知
所以只能先读
读到空行之后,游标i可以回滚
用python,小弟水平不佳,只能下面这样了。
你看看有什么改进的空间没?
===================================================
'''
SrtMerger.py
@author: coupondeal
'''
import re
import os
base_dir = r"C:\Users\coupondeal\Desktop\srts"
dfList = [os.path.join(base_dir, short_name) for short_name in os.listdir(
base_dir)]
for srt_file in dfList:
if (os.path.isfile(srt_file) and srt_file.endswith(".srt")):
with open(srt_file, 'r', encoding='utf-8') as input_srt:
read_data = input_srt.readlines()
if not (os.path.exists(srt_file + ".bak")):
os.rename(srt_file, srt_file + ".bak")
output_srt = open(srt_file,'w', encoding='utf-8')
section_start = 0
for index in range(0, len(read_data)):
line = read_data[index]
if ((line.strip() == "") or (index == len(read_data)-1)):
for j in range(section_start, index+1):
if ((j>=section_start+2) and (j<=index-2)):
output_srt.write (read_data[j].strip() + ' ')
else:
output_srt.write (read_data[j])
section_start = index + 1
output_srt.close()
===================================================
输入:
1
00:00:03,589 --> 00:00:04,773
(
wolf
howls
)
2
00:00:04,775 --> 00:00:06,441
(ee
rie mo
aning)
3
00:00:06,443 --> 00:00:07,776
(evil
laughter)
4
00:00:07,778 --> 00:00:10,479
MAN:
What's up, man
?
5
00:00:11,848 --> 00:00:14,817
Shut your mouth
and act like you got some
sense,
girl!
6
00:00:16,452 --> 00:00:18,237
Are
you sure you have the
right address?
===================================================
输出:
1
00:00:03,589 --> 00:00:04,773
(wolf howls)
2
00:00:04,775 --> 00:00:06,441
(eerie moaning)
3
00:00:06,443 --> 00:00:07,776
(evil laughter)
4
00:00:07,778 --> 00:00:10,479
MAN: What's up, man?
5
00:00:11,848 --> 00:00:14,817
Shut your mouth and act like you got some sense, girl!
6
00:00:16,452 --> 00:00:18,237
Are you sure you have the right address?
===================================================
【在 p**o 的大作中提到】 : 你给个具体的需求,我帮你改一改,看会不会比你的walkaround好一点
| p*****2 发帖数: 21240 | | s*****V 发帖数: 21731 | 9 比如要做矩阵运算的时候就不好了,还得搞两个计数器。
【在 E*****m 的大作中提到】 : 什麼情況下這樣比較不好呢?
| p**o 发帖数: 3409 | 10 貌似几行代码就可以,没看明白为什么要写这么大一坨
把srt文件当作附件贴上来看看
【在 c********l 的大作中提到】 : 好的,多谢!!! : 小弟这里有一些网上下载下来的srt字幕文件, : 这些字幕文件在里面不知道为什么加入了多余的回车换行,导致看起来十分吃力 : 我想把多余的换行去掉,保证每组字幕显示只出现在单行 : .srt文件的定义: : 每组字幕在源文件中占据N行: : 第一行是index : 第二行是两个时间,中间用“-->”连接 : 第三行到第N-1行是字幕 : 第N行是空行
| | | p**o 发帖数: 3409 | 11 简单地说,输入
1\n
X --> Y\n
a\n
b\n
c\n
\n
2\n
X --> Y\n
a\n
b\n
c\n
\n
第一步,把时间行和空行首位添加制表符,全部存成一个字符串
1\n
\tX --> Y\n\t
a\n
b\n
c\n
\t\n\t
2\n
\tX --> Y\n\t
a\n
b\n
c\n
\t\n\t
第二步,把整个字符串中的换行符全替换为空,变成
1
\tX --> Y\t
a
b
c
\t\t
2
\tX --> Y\t
a
b
c
\t\t
第三步,把制表符全替换成换行符
1
\nX --> Y\n
a
b
c
\n\n
2
\nX --> Y\n
a
b
c
\n\n
也就是
1\n
X --> Y\n
abc\n
\n
2\n
X --> Y\n
abc\n
\n | p**o 发帖数: 3409 | 12 In [1]: s = '1\nX --> Y\na\nb\nc\n\n2\nX --> Y\naa\nbb\ncc\n'
In [2]: import re
In [3]: help(re.sub)
Help on function sub in module re:
sub(pattern, repl, string, count=0, flags=0)
Return the string obtained by replacing the leftmost
non-overlapping occurrences of the pattern in string by the
replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is
a callable, it's passed the match object and must return
a replacement string to be used.
In [4]: re.sub(r'(\n.+-->.+\n)', r'\t\1\t', s)
Out[4]: '1\t\nX --> Y\n\ta\nb\nc\n\n2\t\nX --> Y\n\taa\nbb\ncc\n'
In [5]: s1 = re.sub(r'(\n.+-->.+\n)', r'\t\1\t', s)
In [6]: s1.replace('\n\n', '\n\t\n\t').replace('\n', '')
Out[6]: '1\tX --> Y\tabc\t\t2\tX --> Y\taabbcc'
In [7]: s2 = s1.replace('\n\n', '\n\t\n\t').replace('\n', '')
In [8]: s3 = s2.replace('\t', '\n')
In [9]: print s3
1
X --> Y
abc
2
X --> Y
aabbcc | c********l 发帖数: 8138 | 13 本版MS只能贴图片附件。不能帖别的后缀的附件
【在 p**o 的大作中提到】 : 貌似几行代码就可以,没看明白为什么要写这么大一坨 : 把srt文件当作附件贴上来看看
| c********l 发帖数: 8138 | 14 Thanks
我大致明白你的思路
但是这个算法有两个缺点
1.你这是假定原有srt文件中没有制表符\t,如果原文中有\t怎么办?
你又找找另外一种特殊字符....
2.srt文件扫描两次,而不是一次。文件小的时候无所谓,但文件大的时候影响执行效
率.....
另外有很多例子,就比如for (int i=1; i
【在 p**o 的大作中提到】 : 简单地说,输入 : 1\n : X --> Y\n : a\n : b\n : c\n : \n : 2\n : X --> Y\n : a\n
| E*****m 发帖数: 25615 | 15 用 numpy, 一個計數器都不需要。
【在 s*****V 的大作中提到】 : 比如要做矩阵运算的时候就不好了,还得搞两个计数器。
| p**o 发帖数: 3409 | 16 你这个本身就是很特定的一个需求,代码也没有什么复用价值,属于写完就可以扔的那
种,
当然是尽量用最短的时间用最少的代码写完,get things done即可。
这才是脚本语言的糙快猛哲学。“执行时间”可接受即可,纠结这个作甚。
【在 c********l 的大作中提到】 : Thanks : 我大致明白你的思路 : 但是这个算法有两个缺点 : 1.你这是假定原有srt文件中没有制表符\t,如果原文中有\t怎么办? : 你又找找另外一种特殊字符.... : 2.srt文件扫描两次,而不是一次。文件小的时候无所谓,但文件大的时候影响执行效 : 率..... : 另外有很多例子,就比如for (int i=1; i
| p**o 发帖数: 3409 | 17 不必过于执迷于C风格的for-loop,对于从Pascal过来的人,C的for-loop实在是很2B的
写法,明明干的是几件事,非要挤在一行里写,还隐含了i
。要认识到这是C的糟粕,现代语言的设计师都想方设法摒弃之,而不是因为C的统治现
实而视之为至宝。
【在 p*****2 的大作中提到】 : : http://www.mitbbs.com/article_t/Programming/31243367.html
| s*****V 发帖数: 21731 | 18 如果你要做的举证运算,MODULE里面没有呢?
【在 E*****m 的大作中提到】 : 用 numpy, 一個計數器都不需要。
|
|