Python Can';写入NamedTemporary文件后,无法从中读取

Python Can';写入NamedTemporary文件后,无法从中读取,python,Python,我正在尝试将文件下载到临时文件,并将此文件发布到其他服务。我尝试使用NamedTemporaryFile进行此操作,但我被迫关闭该文件并重新打开它 def main(): validate() logging.basicConfig(filename=sys.argv[2]+".log", level=logging.INFO) if(sys.argv[3][0:4] == "http"): filename = None with te

我正在尝试将文件下载到临时文件,并将此文件发布到其他服务。我尝试使用NamedTemporaryFile进行此操作,但我被迫关闭该文件并重新打开它

def main():
    validate()
    logging.basicConfig(filename=sys.argv[2]+".log", level=logging.INFO)

    if(sys.argv[3][0:4] == "http"):
        filename = None
        with tempfile.NamedTemporaryFile("w+b", delete=False) as file:
            download(file, sys.argv[3])
            #this logging prints nothing
            logging.debug(file.readlines())
    else:
        #this else just process a local file...


def download(file, url):
    logging.info("Downloading file " + sys.argv[3] + "...")
    start = time.time() * 1000
    r = requests.get(sys.argv[3], stream=True, timeout=2.0)

    #just a dummy check....
    if r.status_code == 200:
        for chunk in r.iter_content():
            file.write(chunk)

        file.flush()
    else:
        logging.error("Server returned an error")
        raise StandardError
如果我在with块外重新打开文件并尝试读取它,它就会正常工作。我不明白为什么我必须关闭临时文件并重新打开它

def main():
    validate()
    logging.basicConfig(filename=sys.argv[2]+".log", level=logging.INFO)

    if(sys.argv[3][0:4] == "http"):
        filename = None
        with tempfile.NamedTemporaryFile("w+b", delete=False) as file:
            download(file, sys.argv[3])
            #this logging prints nothing
            logging.debug(file.readlines())
    else:
        #this else just process a local file...


def download(file, url):
    logging.info("Downloading file " + sys.argv[3] + "...")
    start = time.time() * 1000
    r = requests.get(sys.argv[3], stream=True, timeout=2.0)

    #just a dummy check....
    if r.status_code == 200:
        for chunk in r.iter_content():
            file.write(chunk)

        file.flush()
    else:
        logging.error("Server returned an error")
        raise StandardError

有人能给我解释一下吗。我对python开发相当陌生。

这里的问题是readlines()似乎是从上的当前文件位置读取的。 如果您首先查找临时文件的开头,您将获得行

file.seek(0)
logging.debug(file.readlines())

在关闭文件之前,实际上不会写入文件。因此,在关闭它之前,您无法读取它。
with
语句为您关闭它。我可以使用flush()读取正在写入的文件,以强制将缓冲字节写入磁盘。@TimCastelijns:这不是真的。在
flush()
ing之后,保证读取与写入状态一致。@SamuelGarcía:
flush()
不会强制将任何数据写入磁盘。它只确保将进程本地缓冲区传输到操作系统。操作系统可以自由地将数据保存在内存中并在以后写入,只要它保证从同一文件读取的数据与写入的数据一致。如果要强制将数据写入磁盘,则需要调用
os.fsync()
。好的,是的,我只想保持简单。由于是本地访问,我只想被推到IO层。在这种情况下,我不关心文件是否存储为MMap段,或者它是否真的写入磁盘。