如果应该在程序流程中发生文件写入,则不会发生

时间:2010-01-02 14:53:43

标签: python

这对我来说不是一个新问题。从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>> =然后给定值时,应该更新文件。 谢谢大家。

5 个答案:

答案 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

检查您的代码,并非所有打开的文件都已关闭。