我正在使用scrapy来抓取一些数据。 我有2只蜘蛛=蜘蛛a和b
spider a获取一些数据并将其写入文件。 蜘蛛b读取数据。
问题是蜘蛛b得到一个空文件。
我可以看到蜘蛛完成工作后文件已填满。
我花了几个小时来解决这个问题。
代码段:
f = open('file.txt', 'a+')
f.write("str")
f.write("\n")
f.close()
f = open('file.txt')
for line in f:
print line
f.close()
没有出现,这有什么问题?
编辑:我得到了它的工作。 我用'a'打开一个文件 写一行然后关闭文件。 这适用于所有行。修改了代码段。
答案 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