python 修改ass或srt文件(用 pydub 而不是pyssa,实际直接读with open(file_path, ‘r‘, en)。用来改TCL电视机支持的字幕格式,否则双语会叠在一起

文章讲述了作者在使用Python读取ASS字幕文件时遇到的困惑,包括Baidu搜索误导安装不必要的库,以及TCL电视默认播放器对ASS文件的支持限制。最终作者找到了正确的方法,即使用pydub库并解决了电视上的字幕格式问题。
部署运行你感兴趣的模型镜像

主要是有几个坑,要规避

-----其实按txt来读取的话,一个也不用安装,主要是我对python不熟悉,以为要装个什么东西。其实如果按txt来读取的,如果记事本能打开,也不用其他处理的话,不用特殊模块

1.被baidu人工智能坑了一把

我的问题是:在baidu里边搜 python 读取ass

    回答:要使用Python来读取ASS文件(Advanced SubStation Alpha)可以通过第三方库pyssa来完成。首先需要安装pyssa库,可以在命令行中运行以下命令进行安装:

然而这个是错误的,而且pyssa这个库,第一没有轮子WHL,第二pip安装的时候报错 

提示Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/   这个错误

然后网上找了一圈,一看要安装这么大的包,赶紧找轮子,发现也没有轮子。最后想看看其他有没有库,后来发现百度坑我了。

2. 把问题改为:python 读取ass文件

答案就正确了。下面是答案

要使用Python来读取ASS(Advanced SubStation Alpha)字幕文件,可以使用第三方库pydub

首先,确保已经安装了pydub库。如果没有安装,可以通过运行以下命令进行安装:

ip install pydub

然后,在Python中导入所需的模块并编写代码来读取ASS文件内容:

from pydub import AudioSegmentimport os# ASS文件路径file_path = "your_subtitle.ass"# 判断文件类型是否为ASSif file_path[-4:] == ".ass":# 打开ASS文件with open(file_path, 'r', encoding='utf-8') as f:ass_content = f.read()print("ASS文件内容:\n", ass_content)else:print("不支持的文件格式")

  上面的代码会将ASS文件的内容存储到变量ass_content中,并输出该内容。注意,这里默认使用UTF-8编码来读取文件内容。根据实际情况,你也可以选择其他编码方式。

3、TCL电视的默认播放器的字幕不支持的坑(给儿子看电视,不想让他再去选个播放器)

不知道支持哪些字幕格式,反正有几个肯定不支持。ass和srt都是支持的,但是都是有限支持,就是能读,显示出来可能不是你想要的结果(和电脑上看视频不一样)

比如ass里边如下的,会重叠,但是\N 回车是支持的。而且不支持修改字体的大小和位置

至少这段,在电视上都是默认字体(而且会重叠)

Dialogue: 2,0:00:02.45,0:00:04.79,中,,0,0,0,,{\fad(200,200)}水善
Dialogue: 1,0:00:02.45,0:00:04.79,英,,0,0,0,,{\fad(200,200)}Water

另外

如下面这个srt格式的,改变字体位置和大小的,也是不支持的。

如果要自己修改,下面这2个格式解读  也是必要的     srt字幕解析(上)_srt{\pos}-优快云博客

ass格式解读

1
00:00:01,000 --> 00:00:04,000
{\an7} Top-left: an7

2
00:00:05,000 --> 00:00:08,000
{\an8}Top-center: an8

3
00:00:09,000 --> 00:00:12,000
{\an9}Top-right: an9

4
00:00:13,000 --> 00:00:16,000
{\an4}Middle-left: an4

5
00:00:17,000 --> 00:00:20,000
{\an5}Middle-center: an5

6
00:00:21,000 --> 00:00:24,000
{\an6}Middle-right: an6

7
00:00:25,000 --> 00:00:28,000
{\an1}Bottom-left: an1

8
00:00:29,000 --> 00:00:32,000
{\an2}Bottom-Center an2

9
00:00:33,000 --> 00:00:36,000
{\an3}Bottom-right: an3

11
00:00:37,000 --> 00:00:45,000
Back to default
{\pos(200,230)} # 和改变字体颜色等命令一样, 在爱奇艺万能播放器可用, 但ffmpeg合并时不支持该命令.

下面是Python 3.10写的

主要是把下面这个形式

Dialogue: 2,0:00:02.45,0:00:04.79,中,,0,0,0,,{\fad(200,200)}水善
Dialogue: 1,0:00:02.45,0:00:04.79,英,,0,0,0,,{\fad(200,200)}Water
Dialogue: 2,0:00:05.33,0:00:07.00,中,,0,0,0,,{\fad(200,200)}土强
Dialogue: 1,0:00:05.33,0:00:07.00,英,,0,0,0,,{\fad(200,200)}Earth

改为这个形式

Dialogue: 0,0:00:02.45,0:00:04.79,CC,,51,51,0,,水善\N{\fn微软雅黑\fs45}Water
Dialogue: 0,0:00:05.33,0:00:07.00,CC,,51,51,0,,土强\N{\fn微软雅黑\fs45}Earth

import os

# 指定要读取的目录
directory = "/"
# 获取目录下的所有文件和文件夹
files = os.listdir(os.getcwd())

lizi = r""" 
用来自己看看,主要是把下面的变成上面的形式
Dialogue: 0,0:00:02.50,0:00:03.83,CC,,51,51,5,,水善\N{\fn微软雅黑\fs45}Water...
Dialogue: 0,0:00:04.87,0:00:06.29,CC,,51,51,5,,土强\N{\fn微软雅黑\fs45}Earth...
一开始是把读Dialogue: 2和Dialogue: 1,后来发现还有3,所有不行了,只能默认中文在上,英文在下。
Dialogue: 2,0:00:02.45,0:00:04.79,中,,0,0,0,,{\fad(200,200)}水善
Dialogue: 1,0:00:02.45,0:00:04.79,英,,0,0,0,,{\fad(200,200)}Water
Dialogue: 2,0:00:05.33,0:00:07.00,中,,0,0,0,,{\fad(200,200)}土强
Dialogue: 1,0:00:05.33,0:00:07.00,英,,0,0,0,,{\fad(200,200)}Earth
"""
# from pydub import AudioSegment 没必要 下面都没用到
for file in files:
    print(file)
# ASS文件路径
    #file_path = "S01E17.ass"
    strar1 = """[Script Info]
    ; Script generated by Aegisub 3.2.2
    ; http://www.aegisub.org/
    Title: 【BluRay 1080p】降世神通 Avatar: The Last Airbender 第二季 S02 (Book 2: Earth) 中英双字幕 中文(中国)字幕
    Original Script: Generated by Xmader/bilitwin based on https://www.bilibili.com/video/av48304410?from=search&seid=10565814691118317516
    ScriptType: v4.00+
    PlayResX: 1440
    PlayResY: 1080
    Timer: 100.0000
    YCbCr Matrix: TV.601

    [Aegisub Project Garbage]
    Audio File: ../修改完成/Avatar The Last Airbender (2005) S02E01 The Avatar State.mkv
    Video File: ../修改完成/Avatar The Last Airbender (2005) S02E01 The Avatar State.mkv
    Video AR Mode: 4
    Video AR Value: 1.333333
    Video Zoom Percent: 0.500000
    Scroll Position: 313
    Active Line: 317
    Video Position: 33404

    [V4+ Styles]
    Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
    Style: CC,方正黑体简体,60,&H00FFFFFF,&H00FFFFFF,&H00000000,&H7F000000,0,0,0,0,100,100,0,0,1,2,3,2,51,51,5,0

    [Events]
    Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
    """

    
    d1 = 'Dialogue: 0'
    m1 = ',CC,,51,51,5,,'
    m2=r"""\N{\fn微软雅黑\fs45}"""
 
    # 判断文件类型是否为ASS and file[0:5]=='S03E01'
    if file[-4:] == ".ass" and file[0:1]!='N' :
        # 打开ASS文件
        with open(file, 'r', encoding='utf-8') as f:
            ass_content = f.read()
        
        #print("ASS文件内容:\n", ass_content)
        t1=ass_content.find("Dialogue:")
        str=ass_content[t1:]
        lines = str.split("\n")
        outstr=''
        lmark='1'
        laststart=''
        for line in lines:
            l2=line.split(",")
            if len(l2)>2:
                if l2[1] == laststart:
                    #不去做排序和判断,默认为上面是中文,下面是英文。中文在上,英文在下,另外考虑到有时候只有中文或者只有英文,那么回车放在开头比较好
                    n1=m2+line[line.find('}')+1:]
                    laststart=l2[1]
                    outstr=outstr+n1
                else:
                    n1="\n"+d1+','+l2[1]+','+l2[2]+m1+line[line.find('}')+1:]
                    laststart=l2[1]
                    outstr=outstr+n1
        
        
    # print("ASS文件内容:\n", ass_content[t1:])
        print(n1) 
        with open("N"+file, 'w', encoding='utf-8') as nfile:
        # 写入一些文本内容
            nfile.write(strar1+outstr)  
    else:
        print("不支持的文件格式")
    # print(outstr)

   下面这个代码用来读取srt文件,直接按txt来,然后来个文件另存为.srt或者.txt。

自己可以测试一下,如果可以用txt打开的,打开来没有乱码。如果用python把这个文件就看成文本,按文本自己去处理的话,那么真的不用装什么其他库了。装了某个库其实是有结构的处理这些信息,比如srt能读取起始时间了。要不然没啥用。

import os

# 指定要读取的目录
directory = "/"
# 获取目录下的所有文件和文件夹
files = os.listdir(os.getcwd())


for file in files: 
# 打印文件清单 print(file)
    if file[-4:] == ".srt":
         with open(file, 'r', encoding='utf-8') as f:
            ass_content = f.read()
            print("ASS文件内容:\n", ass_content)
         with open("N"+file, 'w', encoding='utf-8') as nfile:
        # 写入一些文本内容
            nfile.write('abc123')  

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们正在讨论Python中的`withopen`语句。用户想了解`withopen(file2_path,'r')asf2`的作用和原理。根据引用[2]和[3],`withopen`语句是Python中用于文件操作的上下文管理器。它自动管理文件的打开和关闭,即使在操作过程中发生异常也能确保文件被正确关闭。具体到这条语句:-`open(file2_path,'r')`:打开位于`file2_path`路径的文件,模式为取('r')。-`asf2`:将打开的文件对象赋值给变量`f2`,这样我们就可以在`with`语句块中使用`f2`来操作文件。在`with`语句块中,我们可以使用`f2`进行取操作,比如`f2.read()`。当`with`语句块执行完毕(无论正常结束还是发生异常),文件都会自动关闭,相当于调用了`f2.close()`。原理方面,引用[5]提到,`with`语句利用了上下文管理器的概念。`open()`函数返回的文件对象实现了上下文管理器协议,即包含`__enter__`和`__exit__`方法:-进入`with`块时,调用`__enter__`方法,返回文件对象并赋值给`f2`。-退出`with`块时,调用`__exit__`方法,在这个方法中会关闭文件。这样设计的好处是避免因忘记关闭文件发生异常导致文件未关闭而引发资源泄露。另外,关于编码问题,引用[1]和[4]提到,在Python3中,可以通过指定`encoding`参数来处理文本文件的编码,例如`encoding='utf-8'`。如果不指定,将使用系统默认编码。如果遇到编码问题,还可以通过`errors`参数指定错误处理策略。因此,总结如下:1.作用:以只方式安全地打开文件,并在使用后自动关闭。2.原理:通过上下文管理器协议自动管理文件的打开和关闭。现在,根据系统指令,我们需要生成相关问题。考虑到用户正在学习文件操作,可以提出以下问题:1.文件打开模式有哪些?比如写入模式、追加模式等。2.如何处理文件操作中的编码问题?3.如果不使用`with`语句,如何确保文件正确关闭?4.如何同时打开多个文件?最后,在回答中引用相关段落时,要自然地添加引用标识。</think>### Python `with open` 语句详解 #### 作用与原理 `with open(file2_path, 'r') as f2` 是 Python 文件操作的**上下文管理器**实现,核心作用包括: 1. **安全打开文件**:以只模式(`'r'`)打开 `file2_path` 路径的文件 2. **自动资源管理**:进入 `with` 代码块时自动调用 `__enter__` 方法返回文件对象 `f2`;退出代码块时自动调用 `__exit__` 方法关闭文件(等效于 `f2.close()`)[^2][^5] 3. **异常安全保证**:即使文件操作过程中发生异常(如取错误),也能确保文件被正确关闭,避免资源泄漏[^5] 等价于传统写法的优化: ```python # 传统写法(需手动关闭) f2 = open(file2_path, 'r') try: # 文件操作... finally: f2.close() # 必须显式关闭 # with 写法(自动关闭) with open(file2_path, 'r') as f2: # 文件操作... data = f2.read() # 示例操作 ``` #### 关键特性说明 | 参数/行为 | 说明 | |----------------|---------------------------------------------------------------------| | 文件模式 `'r'` | 只文本模式(默认)[^3],取内容返回字符串 | | 自动关闭机制 | 退出 `with` 块时自动触发 `f2.close()`,无需 `finally` 块[^2] | | 异常处理 | 若代码块内发生异常,`__exit__` 会先关闭文件再传播异常[^5] | | 编码处理 | 文本模式建议显式指定 `encoding`(如 `encoding='utf-8'`)避免乱码[^1][^4] | #### 典型应用场景 ```python # 安全文件内容 with open("data.txt", "r", encoding="utf-8") as f: content = f.read() # 取全部内容 # 逐行处理大文件(内存高效) with open("large.log", "r") as f: for line in f: # 迭代器逐行取 process(line) # 二进制文件with open("image.png", "rb") as f: # 二进制模式 binary_data = f.read() ``` > **注意**:Python 2 与 3 的编码处理差异较大,Python 3 推荐始终显式指定 `encoding` 参数[^1][^4]。若遇乱码可尝试 `errors='ignore'` 跳过非法字符[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值