Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有一种方法可以删除/编辑名为;标签";从音频文件中删除而不安装任何其他内容?_Python_Python 2.7_Audio_Tags_Metadata - Fatal编程技术网

Python 是否有一种方法可以删除/编辑名为;标签";从音频文件中删除而不安装任何其他内容?

Python 是否有一种方法可以删除/编辑名为;标签";从音频文件中删除而不安装任何其他内容?,python,python-2.7,audio,tags,metadata,Python,Python 2.7,Audio,Tags,Metadata,我想删除音频文件中的一段数据,例如iTunes用于在歌曲列表中显示的数据。它还使用这段数据对它们进行排序。我相信这段数据是文件元数据的一部分,称为tag 我想使用一个自行编写的Python脚本来实现这一点。我不想手动或通过更改计算机上的任何内容来执行此操作 我发现使用stat模块无法做到这一点。我正在使用python2.7.10 我现在对两种文件格式感兴趣:mp3和mp4。我在这里读了一些关于mp3格式的书:。上面写着:“ID3v1标记占用128个字节,从文件末尾的字符串标记128个字节开始。”

我想删除音频文件中的一段数据,例如iTunes用于在歌曲列表中显示的数据。它还使用这段数据对它们进行排序。我相信这段数据是文件元数据的一部分,称为
tag

我想使用一个自行编写的Python脚本来实现这一点。我不想手动或通过更改计算机上的任何内容来执行此操作

我发现使用stat模块无法做到这一点。我正在使用
python2.7.10

我现在对两种文件格式感兴趣:mp3和mp4。我在这里读了一些关于mp3格式的书:。上面写着:“ID3v1标记占用128个字节,从文件末尾的字符串标记128个字节开始。”所以我试图通过用0覆盖这些字节来删除它们

感谢martineau,我改进了我的剧本:

import os
import sys

# had to use a different file which really contains a tag
vPath = "/Users/klausdorsch/Desktop/wegdamit/Armada.01.mp3" 
with open(vPath, "r+b") as vFile:  # Open existing file for reading and writing.
    vFile.seek(-128, os.SEEK_END)  # Seek 128 bytes before end of file.
    # Verify ID3v1 tag header starts there.
    tag = vFile.read(3)
    if tag == 'TAG':
        print 'found a tag!'
        # had to add brackets in the line below to avoid TypeError: 
        # unsupported operand type(s) for -: 'str' and 'int'
        vFile.write('\x00' * (128-3))  # Zero-out tag's contents.

sys.exit()

当我第一次运行它时,它会输出:“找到一个标记!”,这样就找到了一个标记。当我第二次运行它时,没有这样的输出,所以标签应该被删除。但是当我用iTunes打开文件时,标签的内容仍然在那里。

我认为主要问题是你打开文件的模式会首先截断它。您正在
seek()
ing的方式和位置似乎也不正确-它只需要执行一次,因为对文件的读写会自动提升其内部当前位置

试着这样做,这样会使文件的其余部分保持不变,如果找到ID3v1标记,则只会将其内容置零

import os
import sys

vPath = "/Users/klausdorsch/Desktop/wegdamit/08ICanMakeYouAManReprise.mp3"
with open(vPath, "r+b") as vFile:  # Open existing file for reading and writing.
    vFile.seek(-128, os.SEEK_END)  # Seek 128 bytes before end of file.
    # Verify ID3v1 tag header starts there.
    tag = vFile.read(3)
    if tag == 'TAG':
        vFile.write('\x00' * 128-3)  # Zero-out tag's contents.

sys.exit()

我认为主要的问题是你打开文件的方式会首先截断它。您正在
seek()
ing的方式和位置似乎也不正确-它只需要执行一次,因为对文件的读写会自动提升其内部当前位置

试着这样做,这样会使文件的其余部分保持不变,如果找到ID3v1标记,则只会将其内容置零

import os
import sys

vPath = "/Users/klausdorsch/Desktop/wegdamit/08ICanMakeYouAManReprise.mp3"
with open(vPath, "r+b") as vFile:  # Open existing file for reading and writing.
    vFile.seek(-128, os.SEEK_END)  # Seek 128 bytes before end of file.
    # Verify ID3v1 tag header starts there.
    tag = vFile.read(3)
    if tag == 'TAG':
        vFile.write('\x00' * 128-3)  # Zero-out tag's contents.

sys.exit()

您可以在Python中使用附带的
struct
模块来完成。这样做需要深入了解文件格式,以及如何使用模块读取文件的不同部分并找到所需的元数据。如果您是Python新手,这可能会相当困难……这太快了!谢谢我已经在我的计算机上安装了struct模块,并且我已经使用python 15年了。但是,我不太了解文件格式,也不知道如何使用模块读取文件的不同部分并找到所需的元数据。你能提供一些代码吗?对不起,这不是一个“为我写一些代码”的网站。您甚至还没有精确定义您感兴趣的文件格式。无论如何,我建议您根据模块和您能找到的任何文件格式文档自己尝试一下。我还强烈建议您升级到Python3。无论如何,非常感谢。如果您在某些特定的问题上遇到困难,请随时在这里提出具体问题。希望你的努力进展顺利。提示:如果在二进制模式下
open()
文件,则可以
seek()
到文件中的任何位置读取或写入数据。可以使用
struct
模块解析读取的数据,并将其转换为等效的Python数据类型。这个过程也可以颠倒,您可以在Python中使用附带的
struct
模块来完成。这样做需要深入了解文件格式,以及如何使用模块读取文件的不同部分并找到所需的元数据。如果您是Python新手,这可能会相当困难……这太快了!谢谢我已经在我的计算机上安装了struct模块,并且我已经使用python 15年了。但是,我不太了解文件格式,也不知道如何使用模块读取文件的不同部分并找到所需的元数据。你能提供一些代码吗?对不起,这不是一个“为我写一些代码”的网站。您甚至还没有精确定义您感兴趣的文件格式。无论如何,我建议您根据模块和您能找到的任何文件格式文档自己尝试一下。我还强烈建议您升级到Python3。无论如何,非常感谢。如果您在某些特定的问题上遇到困难,请随时在这里提出具体问题。希望你的努力进展顺利。提示:如果在二进制模式下
open()
文件,则可以
seek()
到文件中的任何位置读取或写入数据。可以使用
struct
模块解析读取的数据,并将其转换为等效的Python数据类型。这一过程也可以逆转。