从第二个蜘蛛读取的文件得到了证实

时间:2012-07-19 18:27:42

标签: python python-2.7 scrapy

我正在使用scrapy来抓取一些数据。 我有2只蜘蛛=蜘蛛a和b

spider a获取一些数据并将其写入文件。 蜘蛛b读取数据。

问题是蜘蛛b得到一个空文件。

我可以看到蜘蛛完成工作后文件已填满。

我花了几个小时来解决这个问题。

代码段:

蜘蛛a

f = open('file.txt', 'a+')
f.write("str")
f.write("\n")
f.close()

蜘蛛b

f = open('file.txt')
for line in f:
  print line
f.close()

没有出现,这有什么问题?

编辑:我得到了它的工作。 我用'a'打开一个文件 写一行然后关闭文件。 这适用于所有行。

修改了代码段。

2 个答案:

答案 0 :(得分:1)

(1)你想在“蜘蛛b”中使用f.close()而不是f.close。现在的样子,你正确关闭文件,所以它的缓冲区没有被刷新。

此外,关于您在“蜘蛛a”中使用f.flush(),请确保您已从文档中了解此说明:

  

注意flush()不一定将文件的数据写入磁盘。使用    flush()后跟 os.fsync()以确保此行为。

事实上,除非你有充分的理由,否则只有close()文件可能会更好。如果您确实要/需要刷新它,请确保您也使用os.sfsync()

(2)此外,而不是

for line in f:
   print f

试试这个:

for line in f:
   print line

最后请注意,使用with来管理打开的文件。例如

with open('file.txt') as f:
   # put file related actions here
   for line in f:
      print line

会自动关闭块末尾的文件,或者遇到异常。

答案 1 :(得分:0)

除了您使用f.close()print line进行的两个拼写错误之外,您的示例不会显示任何问题。我的猜测是在您尝试在b中迭代文件的实际代码中,然后等待添加更多数据,然后b尝试继续交互。你不能这样做。如果迭代器到达终点,则无法恢复。解决这个问题的最简单方法是使用f.readline():

重写代码
while True:
    line = f.readline()
    if not line:
        break
    print line