0

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

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

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

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

我花了几个小时才弄清楚这一点。

代码片段:

蜘蛛甲

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'打开一个文件写一行然后关闭文件。这适用于所有线路。

修改了代码片段。

4

2 回答 2

1

(1)你想要f.close()而不是f.close“蜘蛛b”。现在的方式是,您没有正确关闭文件,因此它的缓冲区没有被刷新。

此外,关于您在“spider 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

将在块末尾或遇到异常时自动关闭文件。

于 2012-07-19T18:29:06.937 回答
0

您的示例没有显示任何问题,除了您使用f.close()and制作的两个拼写错误print line。我的猜测是在您的真实代码中,您尝试遍历 b 中的文件,然后等待 a 添加更多数据,然后 b 尝试继续交互。你不能这样做。如果迭代器结束,则无法恢复。解决这个问题的最简单方法是使用 f.readline() 重写代码:

while True:
    line = f.readline()
    if not line:
        break
    print line
于 2012-07-19T18:54:57.473 回答