尝试将绝对.m3u路径转换为相对.m3u路径

时间:2018-12-22 17:53:23

标签: python

我正在尝试从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,但它为空白或为空。我确实环顾四周,并在其他地方发布了有关解决方案的信息,但没有成功。此时我已经精疲力尽。任何人?谢谢。

3 个答案:

答案 0 :(得分:1)

您使用

来称呼它
c:\temp>playlist.py playlist.m3u > playlistout.m3u

,它将stdout的{​​{1}}打印输出重定向到playlist.py。但是,在您的程序中您什么都不打印。您的程序实际上在这些行中将其写回到原始输入文件中

playlistout.m3u

您调用该程序的方式实际上是希望将这些行替换为

fp = open(infile, "w")
for line in outlines:
    fp.write(line)
fp.close()

您实际上不需要存储轮廓,可以重写程序以排除该部分,但是我们将其保存以备后用。

如果您想确保要在轮廓中生成任何内容,则可以执行以下操作:

for line in outlines:
    print(line)

答案 1 :(得分:0)

此答案讨论从绝对路径信息中提取相对路径信息所需的脚本代码,该绝对路径信息通常在独立媒体中心文件和数据库管理器创建的播放列表中找到。然后可以生成播放列表,并将其与媒体文件一起导出到家庭中的便携式平板电脑和手机中。

作为原始海报,我正在回答自己的问题。我在原始帖子中做了很多个人研究。好像有很多东西聚集在一起,最近在这里。因此,我针对相同的一般问题提供了2个答案。谢谢。比尔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.

这是播放列表。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脚本中指定,我要将输出打印到何处以及到哪个命名文件?

答案 2 :(得分:0)

此答案主要讨论将输出发送到特定本地计算机硬盘驱动器和文件夹的脚本代码。我在这里发布了2个答案。我在回答自己的问题,作为发帖人。我在原始帖子中做了很多个人研究。好像有很多东西聚集在一起,最近在这里。因此,我针对相同的一般问题提供了2个答案。谢谢。比尔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。我修改了先前的打印命令,现在指向输出文件,该文件先前与我的首选本地硬盘驱动器位置相关联。请注意,使用双后斜杠。

最后,这是读取绝对路径播放列表,然后为我的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或命令行中运行它。但这是另一天。圣诞快乐。