簡體   English   中英

Python:創建一個空文件對象

[英]Python: Creating an empty file object

我試圖為Python創建一個無法正常工作的日志記錄模塊,因為它無法創建文件對象。

debug.py:

import os
import datetime
import globals

global fil
fil = None

def init(fname):
     fil = open(fname, 'w+')
     fil.write("# PyIDE Log for" + str(datetime.datetime.now()))

def log(strn):
    currentTime = datetime.datetime.now()

    fil.write(str(currentTime) + ' ' + str(os.getpid()) + ' ' + strn)
    print str(currentTime) + ' ' + str(os.getpid()) + ' ' + strn

def halt():
    fil.close()

FIL將無法正常工作None ,因為我得到一個AttributeError 我也試過創建一個虛擬對象:

fil = open("dummy.tmp","w+")

但是,即使在log()之前調用init() ,也會寫入dummy.tmp文件。 顯然,您無法在已打開的文件上打開新文件。 我試圖在init()之前關閉fil ,但是Python說它無法對已關閉的文件執行write()

這是訪問debug.py的代碼

if os.path.exists(temp):
         os.rename(temp, os.path.join("logs","archived","log-" + str(os.path.getctime(temp)) + ".txt"))
         debug.init(globals.logPath)
         debug.log("Logger initialized!")

我想登錄我的程序,我找不到解決方法。

您的問題是您沒有分配給全局fil

def init(fname):
    fil = open(fname, 'w+')

這將創建一個名為fil的新局部變量。

如果要分配給全局變量fil ,則需要將其放入本地范圍:

def init(fname):
    global fil
    fil = open(fname, 'w+')

如果您想創建自己的日志記錄模塊,那么您可能希望將已有的內容轉換為類,以便將其作為模塊導入。

#LoggerThingie.py
import os
import datetime



class LoggerThingie(object):
    def __init__(self,fname):
         self.fil = open(fname, 'w+')
         self.fil.write("# PyIDE Log for" + str(datetime.datetime.now()))

    def log(self,strn):
        currentTime = datetime.datetime.now()
        self.fil.write(str(currentTime) + ' ' + str(os.getpid()) + ' ' + strn)
        print str(currentTime) + ' ' + str(os.getpid()) + ' ' + strn

    def halt(self):
        self.fil.close()

如果你把它作為一個類,你就不必首先跟蹤全局變量(這通常被理解為編程領域的不良實踐: 為什么全局變量是邪惡的?

既然它現在是一個模塊,當你想在另一個python程序中使用它時,你會這樣做:

from LoggerThingie import LoggerThingie
#because module filename is LoggerThingie.py and ClassName is LoggerThingie

然后在任何地方使用它,例如:

x = LoggerThingie('filename.txt') #create LoggerThingie object named x

並且每次要將日志插入其中:

x.log('log this to the file')

當你最終完成時:

x.halt() # when ur done

如果你不想從一個空文件開始,你可以使用StringIO將消息保存在內存中,並在最后將它們寫入磁盤,但要小心,如果發生了什么事情並且你沒有寫入消息,它們就會丟失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM