字幕项目:如何解决unicode阅读失败?

时间:2017-03-10 19:45:30

标签: python unicode

基本上我正在做一个字幕项目。 非常复杂,但我只想在转换后的ASS文件中的所有行后面插入行(当前在实验中仍然是txt文件)

Untouched lines. I won't talk about Aegisub problems here

  

对话:0,0:00:00.00,0:00:03.90,默认,, 0,0,0 ,, Hello,观众。这是重组者,

     

对话:0,0:00:03.90,0:00:07.04,默认,, 0,0,0 ,,我们以组件形式拍摄日常物品的节目

     

对话:0,0:00:07.04,0:00:10.24,默认,0,0,0,并将它们放回原处,非常缓慢。

目标: 对话部分中的每一行都附有 '\N{\3c&HAA0603&\fs31\b1}'

Modified lines, still Aegisub stuff

  

对话:0,0:00:00.00,0:00:03.90,默认,, 0,0,0 ,, Hello,观众。这是重组器,\ N {\ 3c& HAA0603& \ fs31 \ b1}

     

对话:0,0:00:03.90,0:00:07.04,默认,, 0,0,0 ,,我们以组件形式采集日常物品的节目\ N {\ 3c& HAA0603& \ fs31 \ B1}

     

对话:0,0:00:07.04,0:00:10.24,默认,0,0,0,并将它们放回原点,非常缓慢。\ N {\ 3c& HAA0603& \ fs31 \ b1 }

Python 3.x代码:

text1 = open('d:\Programs\sub1.txt','r')
text2 = open('e:\modsub.ass','w+')

alltext1 = text1.read()
lines = alltext1.split('\n')
for i in range(lines.index('[Events]')+1,len(lines)):
    lines[i] += '    hello    '
print(lines)
text2.write(str(lines))
text1.close()
text2.close()

1.Python不能识别其中的一个或两个字符,显然是在unicode中

 '\N{\3c&HAA0603&\fs31\b1}'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-23: unknown Unicode character name

如何在不影响输出的情况下处理它?<​​/ p>

2.当我使用'hello'而不是字幕代码时,输​​出是这样的:

  

'对话:0,0:00:07.04,0:00:10.24,默认,0,0,0,并将它们放回原处,非常缓慢。你好','对话:0,0:00:10.24,0:00:11.72,默认,0,0,0 ,,,感觉非常好。你好','对话:0,0:00:11.72,0:00:13.36,默认,0,0,0 ,,哦,是的。看那个!你好',

等等,而不是线后排列的线。 如何使字符串排成一行并取出引号和内容?

2 个答案:

答案 0 :(得分:0)

使用原始字符串文字,即替换:

'\N{\3c&HAA0603&\fs31\b1}'

使用:

r'\N{\3c&HAA0603&\fs31\b1}'

通过这种方式,解释器不会尝试查找不存在的名为\3c&HAA0603&\fs31\b1的unicode字符。

>>> '\N{\3c&HAA0603&\fs31\b1}'
  File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-23: unknown Unicode character name
>>> r'\N{\3c&HAA0603&\fs31\b1}'
'\\N{\\3c&HAA0603&\\fs31\\b1}'
>>> print(r'\N{\3c&HAA0603&\fs31\b1}')
\N{\3c&HAA0603&\fs31\b1}

答案 1 :(得分:0)

问题是你正在使用一个包含\个字符的字符串,而不会转义它们。您需要将它们加倍或使用r''表示法。

lines[i] += '\\N{\\3c&HAA0603&\\fs31\\b1}'

lines[i] += r'\N{\3c&HAA0603&\fs31\b1}'

至于你的另一个问题,你正在编写显示文字表示的str(lines)。请改用'\n'.join(lines) + '\n'