Python 文件写入在程序流中应该发生时不会发生

Python 文件写入在程序流中应该发生时不会发生,python,Python,这对我来说不是一个新问题。在Windows Mobile、Windows XP和其他Windows版本上,从C到PERL再到Python,这个问题一直存在,让我神经紧张 现在,在我最新的脚本中,这种情况再次发生。 更具体地说:我用Python编写了一个简单的脚本。现在,当从调试器运行时,脚本会正确写入文件,但在调试器之外,脚本无法正常工作。 它不会在应该写入文件时写入文件。 我将Python2.6与eclipse和pydev一起使用 这是密码 import httplib2 import thr

这对我来说不是一个新问题。在Windows Mobile、Windows XP和其他Windows版本上,从C到PERL再到Python,这个问题一直存在,让我神经紧张

现在,在我最新的脚本中,这种情况再次发生。 更具体地说:我用Python编写了一个简单的脚本。现在,当从调试器运行时,脚本会正确写入文件,但在调试器之外,脚本无法正常工作。 它不会在应该写入文件时写入文件。 我将Python2.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大于等于给定值时,应更新该文件。
谢谢大家。

记住你妈妈教你的:

总是齐平()


(在python中,
file\u object.flush()
后跟
os.fsync(file\u object.fileno())

如果用python中的文件句柄打开文件,请记住在完成后关闭它。 乙二醇


显然,您在完成文件处理后忘记关闭它。如果要在关闭文件之前检查其内容,请调用
flush()
方法。例如:

file = open("hello.txt", "a")
file.write(...)
file.flush()      // force write on the disk
file.close()      // finished using the file, close it
检查您的代码,并不是所有打开的文件都在其中关闭。

关于代码: 看起来实际的问题与线程有关,而不是与文件有关:

执行此代码时:

    for t in list:
        fileo.write(t + "\n")
    list = []
    fileo.close()
    fileo = open(OutFile, 'a')
    k = 0
列表
正在被生成的线程修改。我不知道“for x in y”如何与线程一起工作的细节,但我认为它遗漏了在首次执行for循环体之后添加到列表中的元素

要解决这个问题,您需要为
列表
设置一个互斥锁,在整个for循环中锁定该互斥锁(直到清除列表),并且在向列表添加项目时锁定该互斥锁。


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)


这是固定代码。

张贴导致错误的代码problem@radium,如果没有其他内容,请不要使用那样的反斜杠。使用原始字符串(前缀为r,如
r'c:\proxy…”
或使用前斜杠,这在Windows中几乎无处不在。如果文件名以“t”开头,则会有一个选项卡(
\t
)这里没有反斜杠-t…@Peter抱歉,我很糟糕。我总是在perl中使用“/”。这些只是从windows资源管理器中复制粘贴。我确实关闭了文件,请参见if fileo.close()是的。但是请参见fileo=open(OutFile,'a'),之后没有close()调用。这意味着,在上一次迭代中,文件不会被关闭。我不是说如果ProxyList文件不存在,可能会引发未处理的异常。在这种情况下,您只需在终端中打印一个异常,并且不会更新任何文件。我进行了测试,因此文件应该更新两次,以便我可以看到更新。我ink我将启动filemon,看看会发生什么。我从两个示例中都收到了头,但在Procmon中没有写入文件。在我CTR-C脚本之后只是一个日志写入。我更新了close()之前您所说的内容,但仍然没有任何结果。请参见我的第二个答案,您的问题实际上是多处理,与文件无关:)它不是sys.stdout.flush(),而是fileo.flush()@user2599593:已更新以反映添加到问题中的代码,或者更好的是,将open(“file”)用作f:f.write()哦,不。。。见鬼,我很久没有用线程编码了。是的,问题更复杂,我会在完成后给出答案。也许你应该进一步说明你以前的代码错误的原因。

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,))