搜索和替换文件两次
Search and Replace a File Twice
我有一个充满播放列表文件的目录,每个播放列表如下所示:
#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
首先,您的错误是您尝试读取的文件不存在。原因是您当前的目录(您 运行 代码所在的目录)可能是 D:\Users\cla5598\Documents\Aptana Studio 3 Workspace\Playlist_Convert
。但是 os.listdir
returns 只有文件名。第二次列出的目录 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)
你的代码还有一个问题。
if the keyword argument inplace=1 is passed to fileinput.input() or to
the FileInput constructor, the file is moved to a backup file and
standard output is directed to the input file
尝试运行将您的代码保持在当前状态(先备份所有文件!)。您会看到它在每一行周围添加了字符 '
。发生这种情况是因为当您在控制台中键入:
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"):
并删除第一个循环。
我有一个充满播放列表文件的目录,每个播放列表如下所示:
#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
首先,您的错误是您尝试读取的文件不存在。原因是您当前的目录(您 运行 代码所在的目录)可能是 D:\Users\cla5598\Documents\Aptana Studio 3 Workspace\Playlist_Convert
。但是 os.listdir
returns 只有文件名。第二次列出的目录 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)
你的代码还有一个问题。
if the keyword argument inplace=1 is passed to fileinput.input() or to the FileInput constructor, the file is moved to a backup file and standard output is directed to the input file
尝试运行将您的代码保持在当前状态(先备份所有文件!)。您会看到它在每一行周围添加了字符 '
。发生这种情况是因为当您在控制台中键入:
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"):
并删除第一个循环。