Python 刚读完一行就删除它
在python中阅读完一行之后,我正在尝试删除它Python 刚读完一行就删除它,python,file,Python,File,在python中阅读完一行之后,我正在尝试删除它 with open("pages_Romance") as f: for line in f: print "Page: " + line #Do something with the line delete_a_line("pages_Romance", line) 我的函数delete__行的实现方式如下: def delete_a_line(path_file, line): with o
with open("pages_Romance") as f:
for line in f:
print "Page: " + line
#Do something with the line
delete_a_line("pages_Romance", line)
我的函数delete__行的实现方式如下:
def delete_a_line(path_file, line):
with open(path_file, "r") as f:
urls = f.readlines()
if len(urls) == 1:
print "File " + path_file + " deleted"
os.remove(path_file)
else:
with open(path_file, "w") as f:
for url in urls:
if url != line:
f.write(url)
else:
print url
我的文件页面包含200个URL(一行一个),每次我读到一个URL时,我都想删除它。问题是每次我启动脚本时,我都会在同一个位置遇到同样的问题,文件中的URL号163被剪切,然后脚本停止。如果我得到的URL少于163个,效果会很好,但是如果我得到的URL多于163个,我将得到以下输出:
Page: http://www.allocine.fr/films/genre-130
然后脚本停止。我应该:
Page: http://www.allocine.fr/films/genre-13024/?page=163
我想你们可以帮我解决这个问题。如果需要,可以尝试此脚本,它将创建包含200个URL的文件:
def create_url_file():
with open("pages_Romance", "w") as f:
for i in range(1,201):
f.write("http://www.allocine.fr/films/genre-13024/?page=" + str(i) + "\n")
从存储在磁盘上的文件中删除一行并不容易。大多数解决方案——就像您的尝试一样——实际上包括将整个文件读入内存(逐行或一次全部读入),然后将其全部重新写入磁盘,但要删除的行除外 因此,一种更自然的方法是,在遍历和处理行的同时,将要保留的行写入新文件。然后,您可以根据需要删除旧文件并用新文件替换它。这样可以避免将整个文件读入内存
with open("pages_Romance") as in_file, open("pages_Romance_temp", "w") as out_file:
for line in in_file:
print "Page: " + line
#Do something with the line
if delete_this_line == False:
out_file.write(line)
但是,如果你的文件很短,考虑把它全部读入内存并把它处理成一行,这样可以简化你的其他代码。
with open("pages_Romance") as f:
urls = f.readlines()
# Do stuff with urls
urls.remove(unwanted_line)
# etc.
with open("pages_Romance", "w") as f:
f.writelines(urls)
我怀疑您正在迭代一个同时更改的文件。外部循环打开文件,内部循环更改文件的长度。尝试仅从顶级函数进行迭代。虽然我不知道为什么它在工作163行后会中断,但可能是因为您在
delete\u行
中更改了文件,而该文件仍在原始块中打开。在调用delete\u a\u line
之前,我可以通过在每次外部迭代中打开和关闭文件来让它正常工作,因此文件永远不会同时在两个位置打开:
f = open("pages_Romance")
while f:
line = f.readline()
print "Page: " + line
#Do something with the line
f.close()
delete_a_line("pages_Romance", line)
try:
f = open("pages_Romance")
except IOError:
f = None
此外,如果文件本身为空,delete\u\u行
无法删除文件本身,因为它仍然处于打开状态(您正试图使用
块从中删除它)。快速修复方法是设置一个标志,然后删除with块之外的文件:
def delete_a_line(path_file, line):
delete_flag = False
with open(path_file, "r") as f:
urls = f.readlines()
if len(urls) == 1:
delete_flag = True
else:
with open(path_file, "w") as f:
for url in urls:
if url != line:
f.write(url)
else:
print url
if delete_flag:
print "File " + path_file + " deleted"
os.remove(path_file)
但是,我同意其他人的看法,我会尝试一种不同的方法来解决您试图解决的问题,而不是不断地从文件中删除单行。我上面介绍的解决方案效率很低。从文件中删除一行对我来说似乎很奇怪。您可以始终只执行URL=[line.rstrip()for line in file]
,然后简单地使用URL.pop(0)
逐个拉出URL。。。如果你觉得有必要这样做。要知道为什么它停在163,我们需要知道#用这行代码做些什么。但一般来说,你不应该打开同一个文件3次,同时尝试用3个不同的文件处理程序读写。这是为了抓取一个网站,我希望能够在连接的情况下重新启动抓取过程problem@Stuart目前这只是一个评论。我什么也没做,但我有问题。@mel一直都是这样做的。如果在跟踪所处的行时将关键代码包装在try…catch中,作为处理的一部分,您可以将最后成功的行保存到文件、调试,并在检索进度数据后从停止的位置重新启动。在我的例子中,我使用sqlite作为软件,相当于一个记事本来跟踪进度。