我正在尝试从我的playlist.m3u文件中删除绝对路径信息,并使用Python将此文件转换为相对路径。我可以使用连接在一起的Excel脚本来做这件事,它工作得很好,但我认为使用Python会更容易一些。
这是我一直在尝试的一个脚本,但没有成功。
import sys
import os
infile = sys.argv[1]
basepath = os.path.dirname(os.path.abspath(infile))
outlines = []
fp = open(infile)
for line in fp.readlines():
if line.startswith('#'): # m3u comments start with #
outlines.append(line)
else:
outlines.append(os.path.relpath(line, basepath))
fp.close()
fp = open(infile, "w")
for line in outlines:
fp.write(line)
fp.close()
以下是绝对路径播放列表文件内容的示例:
J:\NTFS_1\MP3_D\Dan Fogelberg - River of Souls - 08 - A Love Like This.mp3 J:\NTFS_1\MP3_H\Harry Chapin - Verities & Balderdash - 04 - 30,000 Pounds Of Bananas.mp3
以下是Excel中的相对路径播放列表内容:
\Dan Fogelberg - River of Souls - 08 - A Love Like This.mp3 \Harry Chapin - Verities & Balderdash - 04 - 30,000 Pounds Of Bananas.mp3
我使用命令行执行python代码:
c:\temp>playlist.py playlist.m3u > playlistout.m3u
程序确实会生成输出文件playlistout.m3u,但该文件为空。我真的环顾了四周,在其他地方发布了一个解决方案,但没有成功。在这一点上我已经筋疲力尽了。有没有人?谢谢。
发布于 2018-12-23 01:59:09
您使用以下命令调用此函数
c:\temp>playlist.py playlist.m3u > playlistout.m3u它将playlist.py的stdout打印输出重定向到playlistout.m3u。但是,在您的程序中,您没有打印任何内容。您的程序实际上会在以下几行中写回原始输入文件
fp = open(infile, "w")
for line in outlines:
fp.write(line)
fp.close()您调用此程序的方式实际上是希望将这些行替换为
for line in outlines:
print(line)您实际上不需要存储大纲,并且可以重写程序以排除该部分,但我们将保存该部分,以便稍后使用。
如果您想要确保在大纲中生成任何内容,您可以执行以下操作:
import sys
print("Number of lines to print: {}".format(len(outlines)), file=sys.stderr)
for line in outlines:
print(line)发布于 2018-12-24 07:30:23
该答案涉及从绝对路径信息中提取相对路径信息所需的脚本代码,绝对路径信息通常在由独立媒体中心文件和数据库管理器创建的播放列表中找到。然后,可以生成播放列表,并将其与媒体文件一起导出到家庭中的便携式平板电脑和手机。
作为发起人,我在回答我自己的问题。我在原文中花了很多心血研究这个问题。只是最近似乎有很多东西在这里。因此,我在同一个一般性问题上提供了两个答案。谢谢。比尔·M。
下面的脚本是一种非常简洁的方法,可以将具有完整绝对路径信息的播放列表转换为具有最少相对路径信息的播放列表。我用的是流行的Android音乐播放器,除了。如果标准.m3u播放列表是在外部创建的,并且播放列表包含由家庭媒体中心应用程序生成的完整驱动器和文件夹路径信息,它将无法解密该播放列表。请注意,其他Android mp3播放器应用程序没有遇到这个缺点,但由于其他原因,它们未能给我留下深刻印象。因此,我需要一种方法来删除绝对路径信息。这里是初始条件和解决方案。
我有一个名为playlist.m3u的文件。它是纯文本。文件内容为:
J:\NTFS_1\MP3_D\Dan Fogelberg - River of Souls - 08 - A Love Like This.mp3
J:\NTFS_1\MP3_H\Harry Chapin - Verities & Balderdash - 04 - 30,000 Pounds Of Bananas.mp3我的Android音乐播放器无法识别上面的文件记录,因为每一行或每条记录都包含绝对路径信息,例如J:\NTFS_1\MP3_D和J:\NTFS_1\MP3_H。以上只是一个示例,另外还有MP3_A、MP_B等的绝对路径文件夹。
如果我手动或通过Excel公式转换编辑或以其他方式处理上述行,则这需要是每条记录的开始格式:
\Dan Fogelberg - River of Souls - 08 - A Love Like This.mp3
\Harry Chapin - Verities & Balderdash - 04 - 30,000 Pounds Of Bananas.mp3 这是我在Stackoverflow上找到的一个逐字代码片段,链接:(Splitting path strings into drive, path and file name parts):
with open('C:/Users/visc/scratch/scratch_child/test.txt') as f:
for line in f:
drive, path = os.path.splitdrive(line)
path, filename = os.path.split(path)
print('Drive is %s Path is %s and file is %s' % (drive, path, filename))这是一个符合我要求的修改过的版本。我从DOS命令行执行此命令,这样我就可以在命令行中将结果定向到输出文件。
我将这个脚本命名为playlist.py。在命令行中,我输入:
C:\temp\playlist.py > output.m3u.下面是playlist.py:
import sys
import os
with open('C:/temp/playlist.m3u') as f:
for line in f:
drive, path = os.path.splitdrive(line)
path, filename = os.path.split(path)
# print('Drive is %s Path is %s and file is %s' % (drive, path, filename))
# The original print adds spaces and such. I removed the not necessary
# Drive and Path fields. Note, I Added a "\"
print('\%s' % (filename))我在命令行中测试了上面的内容。它会生成一个根据需要填充的输出文件,如上所示。我还在PyCharm项目社区中测试了该脚本。PyCharm将在屏幕上生成打印输出。当然,这与命令行> output.m3u的重定向输出一致
我很高兴满足了我的好奇心,并对原始帖子的问题有了一个功能性的解决方案。
我仍然需要一些帮助。哪些额外的代码将允许我在python脚本中指定,我希望将输出打印到哪个命名的文件?
发布于 2018-12-24 11:00:41
此答案主要讨论将输出发送到特定本地计算机硬盘驱动器和文件夹的脚本代码。我在这里发布了两个答案。作为发起人,我回答了我自己的问题。我在原文中花了很多心血研究这个问题。只是最近似乎有很多东西在这里。因此,我在同一个一般性问题上提供了两个答案。谢谢。比尔·M。
我之前的回答是原样的,并达到了所描述的目的。在前面的例子中,脚本输出位置是命令行语句变量的函数。我注意到了这个限制。我更喜欢的是能够在python脚本本身中指定输出文件应该放在哪里。经过进一步的研究,我拼凑了几行代码来满足我的需求。这个产品是简约的。不是很优雅。但这对我很管用。如果我能找到一个直接执行此操作的脚本,我会使用它的。也许其他人会发现它直接或间接地有用。
因此,在第二个答案中,对于我自己的问题,我修改了另一个主题中的一些Stackoverflow代码,以允许规定转换后的播放列表输出的位置。
在链接How to redirect the output of print to a TXT file中可以找到处理如何将打印输出重定向到TXT文件的原始代码。
Eli Courtwright的回应之一就是针对这种情况的理想选择。下面是我提取的相关代码片段:
log = open("c:\\goat.txt", "w")
print >>log, "test"下面是我如何适应它们并(后来)将它们结合到我的情况中
outfile = open("c:\\temp\goat.m3u", "w")
print >> outfile,('\%s' % (filename))我从:log更改为:outfile。我修改了之前的print命令,现在指向outfile,它以前与我首选的本地硬盘位置相关联。请注意双后斜杠的使用。
最后,这里是读取一个绝对路径播放列表,然后为我的Android mp3播放器应用程序转换和生成一个新的播放列表文件所需的完整9行代码。
# Python Script to extract playlist relative folder path and names
# Script removes local storage absolute path info from playlist records.
import sys
import os
outfile = open("c:\\temp\goat.m3u", "w")
f = open('output.txt','w')
with open('C:/temp/playlist.m3u') as f:
for line in f:
drive, path = os.path.splitdrive(line)
path, filename = os.path.split(path)
# Note the '\' in the print command. Need this because the
# previous operation removes any/all path info. This 1 '\'
# is required to be restored
print >> outfile,('\%s' % (filename))这就是我的全部。我想我仍然可以写一个像"convert.bat“这样的批处理文件,在这里我可以删除我的原始playlist.m3u文件,并让它直接执行python脚本,而不是从PyCharm或命令行运行它。但那是另一天了。圣诞快乐。
https://stackoverflow.com/questions/53898058
复制相似问题