【问题标题】:Search and Replace a File Twice搜索和替换文件两次
【发布时间】:2015-06-29 03:37:48
【问题描述】:

我有一个充满播放列表文件的目录,每个播放列表如下所示:

#EXTM3U
#EXTINF:116,VME MidSeal
V:\Eagle Presentation\VME_MidSeal.wmv
#EXTINF:0,IMG 1061
\Users\cla5598\Pictures\house\IMG_1061.JPG
#EXTINF:0,IMG 1062
\Users\cla5598\Pictures\house\IMG_1062.JPG
#EXTINF:0,IMG 1067
\Users\cla5598\Pictures\house\Directory\IMG_1067.JPG
#EXTINF:0,IMG 1068

首先我需要用新目录替换目录...例如

\Users\cla5598\Pictures\house\   change to /New/Pictures/

然后我需要将任何其他“\”更改为“/”,因为还有其他子目录

到目前为止,我已经让第一部分工作得很好......但是我遇到了“\”到“/”部分的问题......

到目前为止,我有这个,但最后一部分出现错误:

import os
import fileinput

file_list=[]
for file in os.listdir("D:\Users\cla5598\Documents\Aptana Studio 3 Workspace\Playlist_Convert"):
    if file.endswith(".m3u8"):
        file_list.append(file)

print file_list

for i in file_list:
    f1 = open(i, "r")
    f2 = open("D:\Users\cla5598\Documents\Aptana Studio 3 Workspace\Playlist_Convert\\new\\" + "Pi-" + i, "w+")
    for line in f1:
        f2.write(line.replace("\Users\cla5598\Pictures\house\\", "/New/Pictures/"))

    f1.close()
    f2.close()

file_list_new=[]

for file in os.listdir("D:\Users\cla5598\Documents\Aptana Studio 3 Workspace\Playlist_Convert\\new"):
    if file.endswith(".m3u8"):
        file_list_new.append(file)
print file_list_new        

for b in file_list_new:
    f3 = fileinput.input(b, inplace=1)
    for line in f3:
        line.replace("\\", "/")
    f3.close()

这是我得到的错误:

['list1.m3u8', 'list2.m3u8']
['Pi-list1.m3u8', 'Pi-list2.m3u8']
Traceback (most recent call last):
  File "D:\Users\cla5598\Documents\Aptana Studio 3 Workspace\Playlist_Convert\Playlist_Convert.py", line 30, in <module>
    for line in f3:
  File "C:\Python27\lib\fileinput.py", line 252, in next
    line = self.readline()
  File "C:\Python27\lib\fileinput.py", line 321, in readline
    os.rename(self._filename, self._backupfilename)
WindowsError: [Error 2] The system cannot find the file specified

【问题讨论】:

  • 您遇到什么错误?请完整追溯
  • 你的操作系统是什么?另外,为什么要使用 FileInput?你知道你可以在字符串中使用“r”前缀(r=raw),这样就不需要使用双“\”了吗?例如:r"I'm a raw string so this \n is not a new-line"
  • 嗯,播放列表最初是在 Windows 下创建的……但我正在为我的 Linux raspberry pi 转换它们……不,我不知道“r”…… . 我正在使用文件输入,因为那是我唯一能想到使用的东西
  • 好的,我想我看到了这个问题,但不知道如何解决它......新的播放列表文件位于名为“new”的子目录中,因此无法找到它们我猜?

标签: python file search text replace


【解决方案1】:

首先,您的错误是您尝试读取的文件不存在。原因是您的当前目录(运行代码的目录)可能是D:\Users\cla5598\Documents\Aptana Studio 3 Workspace\Playlist_Convert。但是os.listdir 只返回文件名。在第二次列出目录D:\Users\cla5598\Documents\Aptana Studio 3 Workspace\Playlist_Convert\\new,它不是您的当前目录。所以脚本会尝试读取不存在的文件。要解决这个问题,您应该使用这样的完整路径:

os.path.join(r"D:\Users\cla5598\Documents\Aptana Studio 3 Workspace\Playlist_Convert\new", b)

或者您可以使用相对于当前目录的路径:

os.path.join(r"new", b)

您的代码中还有另一个问题。

来自the documentation

如果关键字参数 inplace=1 被传递给 fileinput.input() 或 FileInput 构造函数,该文件被移动到一个备份文件和 标准输出被定向到输入文件

尝试以当前形式运行您的代码(首先备份所有文件!)。您会看到它在每一行周围添加了字符'。发生这种情况是因为当您在控制台中输入时:

a = "hi"
a

然后你得到'hi' - 你在' 中的字符串。由于标准输出(控制台的输出)被定向到您的文件,这就是发生的事情。

所以你应该做的是代替line.replace("\\", "/")做:

print line.replace("\\", "/"),

注意末尾的“,” - 这样就不会添加新行。

最后一件事:我认为这种方式是错误的,因为没有理由将标准输出定向到您的文件,而且在我看来,使用复杂的库是一种过度杀戮。

我认为你应该像第一部分那样做。只需将输出写入新文件即可。此外,这根本与您的问题无关,但您可能想看看如何在 python 中使用 with 语句。这样你就可以使用with open("some-file") as f: do-things(),python会为你关闭文件。

编辑:

您可以将循环组合起来,同时执行第 1 部分和第 2 部分:

file.write(line.replace("\Users\cla5598\Pictures\house\\", "/New/Pictures/").replace("\\", "/"))

你可以这样做:

for i in os.listdir("D:\Users\cla5598\Documents\Aptana Studio 3 Workspace\Playlist_Convert"):
    if file.endswith(".m3u8"):

并删除第一个循环。

【讨论】:

  • 谢谢!那效果很好。是的,我想过只是重复“/”更改的第一部分,但我会有三组播放列表
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2018-05-17
  • 2014-03-22
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
相关资源
最近更新 更多