Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 刚读完一行就删除它_Python_File - Fatal编程技术网

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

在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 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作为软件,相当于一个记事本来跟踪进度。