这对我来说不是一个新问题。从C到PERL再到Windows Mobile,Windows XP和其他Windows版本的Python,这个问题仍然存在,让我很紧张。
现在我的最新剧本再次发生。 更具体一点:我用Python编写了一个简单的脚本。现在,当从调试器运行时,脚本正确地写入文件,但是在调试器之外它无法正常工作。 它应该在写入时不写入文件。 我使用python 2.6与eclipse和pydev。
这是代码
import httplib2
import thread
ht = httplib2.Http();
list = []
k = 0
def check(proxy, port):
global list
global k
try:
head = ht.request(proxy, 'HEAD')
except:
return
k = k + 1
list.append(proxy)
list.append(port)
def OnListCaller(ProxyList, OutFile, NListLen):
global list
global k
filei = open(ProxyList, 'r')
fileo = open(OutFile, 'a')
while 1:
proxy = filei.readline()
if not proxy: continue
port = filei.readline()
proxy = proxy.rstrip()
port = port.rstrip()
thread.start_new(check, (proxy, port,))
if k >= NListLen:
for t in list:
fileo.write(t + "\n")
list = []
fileo.close()
fileo = open(OutFile, 'a')
k = 0
OnListCaller('C:\proxy\input.txt', 'C:\proxy\checked.txt', 1)
问题出现在if + k = = NListLen的OnListCaller中。 当k>> =然后给定值时,应该更新文件。 谢谢大家。
答案 0 :(得分:8)
记住你妈妈教给你的东西:
总是冲洗()
(在python中,file_object.flush()
后跟os.fsync(file_object.fileno())
)
答案 1 :(得分:2)
关于代码: 看起来实际问题是与线程相关的问题,而不是文件:
在执行此代码时:
for t in list:
fileo.write(t + "\n")
list = []
fileo.close()
fileo = open(OutFile, 'a')
k = 0
您生成的主题正在修改 list
。我不知道'for y in y'如何与线程一起工作的细节,但是我想它在第一次执行body for循环之后错过了添加到列表中的元素。
要解决此问题,您需要一个list
的互斥锁,您可以锁定整个for循环(直到清除了列表),并在每次向列表中添加项时锁定。 / p>
答案 2 :(得分:1)
import httplib2
import thread
import os
import sys
ht = httplib2.Http();
def check(proxy, port, OutFile):
global list
try:
head = ht.request(proxy, 'HEAD')
except:
return
fileo = open(OutFile, 'a')
fileo.write(proxy+"\n")
fileo.write(port+"\n")
sys.stdout.flush()
os.fsync(fileo.fileno())
fileo.close()
def OnListCaller(ProxyList, OutFile, NListLen):
global list
filei = open(ProxyList, 'r')
while 1:
proxy = filei.readline()
if not proxy: continue
port = filei.readline()
proxy = proxy.rstrip()
port = port.rstrip()
#TODO: regleaza pentru unix cand o sa fie nevoie
thread.start_new(check, (proxy, port, OutFile,))
OnListCaller('C:\proxy\input.txt', 'C:\proxy\checked.txt', 1)
这是固定代码。
答案 3 :(得分:0)
如果您在Python中使用文件句柄打开文件,请记得在完成后关闭它。 例如
f=open("file")
....
f.write(....)
f.close()
答案 4 :(得分:0)
显然,您在完成处理后忘记关闭文件。如果要在关闭文件之前检查文件的内容,请调用flush()
方法。例如:
file = open("hello.txt", "a")
file.write(...)
file.flush() // force write on the disk
file.close() // finished using the file, close it
检查您的代码,并非所有打开的文件都已关闭。