我有一个包含我需要的文件处理功能的类.另一个类创建了一个实例,filehandler并在不确定的时间内使用它.最终,它caller被摧毁了,它摧毁了唯一的引用filehandler.
filehandler关闭文件的最佳方法是什么?
我目前使用__del__(self)但在看到几个 不同的 问题 和文章后,我认为这被认为是一件坏事.
class fileHandler:
def __init__(self, dbf):
self.logger = logging.getLogger('fileHandler')
self.thefile = open(dbf, 'rb')
def __del__(self):
self.thefile.close()
Run Code Online (Sandbox Code Playgroud)
这是处理程序的相关部分.该类的重点是抽象出使用底层文件对象的细节,并避免不必要地将整个文件读入内存.但是,处理底层文件的一部分是在对象超出范围时关闭它.
本caller不应该知道或关心参与的细节filehandler.filehandler当它超出范围时,释放所涉及的任何必要资源是我们的工作.这是它首先被抽象的原因之一.所以,我似乎面临着将filehandler代码移动到调用对象或处理漏洞抽象的问题.
思考?
好,
这应该很简单,因为人们一直这样做.我想让POST请求的主体发送扭曲Agent.这是扭曲的FileBodyProducer.在服务器端,我得到了一个方法的request对象render_POST.
我该如何找回尸体?
服务器:
from twisted.web import server, resource
from twisted.internet import reactor
class Simple(resource.Resource):
isLeaf = True
def render_GET(self, request):
return "{0}".format(request.args.keys())
def render_POST(self, request):
return "{0}".format(request.data)
with open(request.args['filename'][0], 'rb') as fd:
fd.write(request.write())
site = server.Site(Simple())
reactor.listenTCP(8080, site)
reactor.run()
Run Code Online (Sandbox Code Playgroud)
客户:
from StringIO import StringIO
from twisted.internet import reactor
from twisted.web.client import Agent
from twisted.web.http_headers import Headers
from twisted.web.client import FileBodyProducer
from twisted.internet.defer import Deferred
from twisted.internet.protocol import Protocol
from pprint import …Run Code Online (Sandbox Code Playgroud) 我目前正在使用com进行Excel的Python自动化.它功能齐全,可以满足我的需求,但我发现了一些令人惊讶的东西.有时,我使用的某些Excel命令会因为没有明显原因的异常而失败.其他时候,他们会工作.
在我正在做的VB等效代码中,这个问题显然被认为是正常的,并且用一个On Error Resume Next语句贴满了.当然,Python没有声明.
我无法将整个集合包裹在一个try except循环中,因为它可能会在中途"失败"并且无法正常完成.那么,将几个独立语句包装到try除块之外的pythonic方法是什么?具体来说,比以下更清洁:
try:
statement
except:
pass
try:
statement
except:
pass
Run Code Online (Sandbox Code Playgroud)
相关的代码是excel.Selection.Borders位.
def addGridlines(self, infile, outfile):
"""convert csv to excel, and add gridlines"""
# set constants for excel
xlDiagonalDown = 5
xlDiagonalUp = 6
xlNone = -4142
xlContinuous = 1
xlThin = 2
xlAutomatic = -4105
xlEdgeLeft = 7
xlEdgeTop = 8
xlEdgeBottom = 9
xlEdgeRight = 10
xlInsideVertical = 11
xlInsideHorizontal = 12
# open file
excel = win32com.client.Dispatch('Excel.Application') …Run Code Online (Sandbox Code Playgroud) 我有一个长期运行的python项目,它使用子进程模块启动各种其他程序.它等待每个程序完成,然后结束包装函数并返回其等待循环.
最终,这使得它运行的计算机停止运行,错误是没有更多的文件描述符可用.
我无法在子流程文档中的任何地方找到子进程关闭时文件描述符会发生什么.起初,我以为它们会自动关闭,因为subprocess.call()命令会一直等到子节点终止.
但如果是这样的话我就不会有问题了.我还认为如果还有剩下的东西,python会在函数完成时进行垃圾收集,并且文件描述符超出范围.但这似乎也不是这样.
我如何才能访问这些文件描述符?subprocess.call()函数只返回退出代码,而不是打开文件描述符.还有什么我在这里不见了吗?
该项目充当各种企业应用程序之间的粘合剂.所述应用程序不能流水线化,它们是gui系统.所以,我唯一能做的就是用内置宏启动它们.这些宏输出文本文件,我用它来管道中的下一个程序.
是的,它听起来一样糟糕.幸运的是,所有文件最终都有非常独特的名字.因此,在接下来的几天里,我将使用下面建议的sys internals工具来尝试跟踪文件.我会告诉你结果如何.
我打开的大多数文件,我只是使用win32file.CopyFile()函数移动它们.
所有,
我有一个打印到流的程序.我需要在内存中缓冲此流,然后根据需要将每行打印到实际文件中.
由于fprintf()函数调用必须有一个FILE *指针,我需要在内存中使用所述指针寻址空间.我曾使用过该open_memstream()功能,但Windows不支持此功能.
因为malloc()返回一个void *指针,根据需要神奇地转换为必要的指针,我可以使用它作为我的FILE *指针吗?如果是这样,有什么警告?我需要注意空间不足吗?
更新:
在找到了open_memstream()比它应该更难的源之后,看起来他们正在为malloc空间做一个文件流.
既然如此,我已经得到了它们的来源,如果我无法通过mingw获得与Windows交叉编译的工作版本,我将会讨论.
我已经安装了PIL 1.1.7和用于Python 2.7的Windows安装程序,我正在尝试使用它来打开TIFF文件.但是,我一直在接受IOError: decoder group4 not available.
丢失了什么?根据我的理解,必须编译必要的库.
好吧,今天我在python中遇到了一个奇怪的惊喜.以下代码有效,但似乎违反了python的语法.我不知道为什么没有pass语句或一些代码它会工作,但确实如此.
def test():
'''Sample docstring.'''
for i in range(10):
test()
print "testing", i
Run Code Online (Sandbox Code Playgroud)
我想确定为什么这样做,以及它在运行时是否在内存中留下任何讨厌的位.这可能是我一直试图追查的内存问题的原因.
所有,
我正在读一个csv文件并使用sqlalchemy将数据添加到MySQL数据库.其中一个表是地址表,它只能保存唯一的地址.这些地址与另一个具有地址id的外键字段的"语句"表之间存在关系.
因此,对于我的数据文件中的每一行,我创建一个新的语句obj,然后获取相关地址的id.如果地址已存在,则返回该id.否则,我创建一个新的地址obj并返回该id.这是使用下面的代码完成的,改编自这个SO问题.
def get_or_create(self, model, rec):
instance = self.session.query(model).filter_by(**dict(filter(lambda (x,y): x in model.__dict__.keys(), rec.iteritems()))).first()
if instance:
return instance
else:
instance = model(rec)
return instance
Run Code Online (Sandbox Code Playgroud)
我正在使用GUID作为我的id字段,它是地址表的主键的一部分:
class address(Base):
__tablename__ = 'address'
id = id_column()
name = Column(String(75), primary_key=True)
Address_Line_One = Column(String(50), primary_key=True)
Address_Line_Two = Column(String(50), primary_key=True)
Address_Line_Three = Column(String(50), primary_key=True)
Address_Line_Four = Column(String(50), primary_key=True)
Run Code Online (Sandbox Code Playgroud)
将id_column()来自这里,虽然它已被转换为CHAR(32)由于限制别处.最后,这里有一个片段:
currStatement = statements(rec, id=currGUID)
currStatement.address = self.get_or_create(address, rec)
Run Code Online (Sandbox Code Playgroud)
这一切都很好,除非它很慢.对于在一个事务中插入的~65,000个语句,我看到干净测试DB上的1.5小时插入时间.实时观察插入显示它快速达到~10,000行,然后插入速度开始下降.
我该怎么做才能加快插入时间?
编辑:
经过进一步测试,我发现插入时间慢是因为每个对象都是单独插入的.所以,我有~65,000行,每行都有几个sqlalchemy对象,单独插入.使用sqlalchemy 0.7,我如何批量插入对象?
好吧,这可能是一个愚蠢的问题,但......
我有一个专有语言的源代码文件.我想用VIM编辑所述文件,而不是他们糟糕的编辑器.我想要语言的基本语法高亮,但我不想花费大量时间来编写自己的语法文件.
因此,VIM有一个基本的源突出显示模块吗?它不需要是完美的,我只是希望它涵盖简单的事情.目前,我唯一的选择是没有语法高亮,选择随机语言,或自己滚动.
编辑:下面的源代码示例
{
function letter do
gposition 0, 0
if gender = "M" do
if language = "SPA" OR state = "PR" do
%male spanish letter
gposition .26, .75
pdfimage "MALE SPANISH.pdf", 1, .93
setcolor truewhite
setfillmode 1
%whitebox
gposition 5.25, 1.25
rectangle 2.5, .5
Run Code Online (Sandbox Code Playgroud)