我有一些目录,我需要更新我使用以下代码
for newdir in newdirs:
olddir = newdir.replace('h:\\','G:\\').replace('_academic','')
shutil.rmtree(newdir)
shutil.copytree(olddir,newdir)
Run Code Online (Sandbox Code Playgroud)
我偶尔会收到一个错误
WindowsError: [Error 5] Access is denied: 'h:\\mydir\\sub1\\sub2\\sub3\\sub4\\sub5'
Run Code Online (Sandbox Code Playgroud)
因为错误不会发生在以前的目录上我决定原因必须是一些访问冲突 - 在rmtree调用和copytree之间发生的时间太少所以我修改了代码以浪费一些时间
for newdir in newdirs:
olddir = newdir.replace('h:\\','G:\\').replace('_academic','')
shutil.rmtree(newdir)
for item in range(0,20,1):
pass
shutil.copytree(olddir,newdir)
Run Code Online (Sandbox Code Playgroud)
这使错误消失,旧目录被复制到新位置.
我不喜欢这个,因为它看起来很摇摇欲坠 - 即使对我来说也是如此.
我正在构建一个应用程序,我试图允许用户提交公司和日期对的列表,并找出该日期是否有新闻事件.新闻事件存储在具有公司标识符和日期作为关键字的字典中.
newsDict('identifier','MM/DD/YYYY')=[list of news events for that date]
Run Code Online (Sandbox Code Playgroud)
这本字典比我想象的要大得多 - 甚至在内存中构建它也是如此,所以我把它分成三部分,每部分都限于特定范围的公司标识符.
我的计划是使用用户提交的列表并使用字典组来查找公司标识符的用户列表,以匹配预期将找到公司事件的特定newsDict,然后一个接一个地加载newsDicts以获取值.
那么现在我想知道将新闻事件保存在列表中是不是更好,列表中的每个项目都是元组的子列表和另一个列表
[('identifier','MM/DD/YYYY'),[list of news events for that date]]
Run Code Online (Sandbox Code Playgroud)
我的想法是,我会有一个字典,其中包含每个公司标识符的列表范围
companyDict['identifier']=(begofRangeinListforComp,endofRangeinListforComp)
Run Code Online (Sandbox Code Playgroud)
我会使用用户输入来查找我需要的范围,并构建一个按范围排序的标识符和范围列表.然后我会读取列表的相应部分以获取数据并构造输出.
我看到的最大原因是,即使将字典分成三部分,每个部分大约需要两分钟才能加载到我的机器上,字典最终需要大约600到750 mb的ram.
我很惊讶地注意到,一个包含800万行的列表只需要大约15秒的时间来加载并使用大约1/3的字典内存的1/3.
此外,由于我在列表中工作时可以丢弃列表中的行,因此当我处理用户列表时,我将释放内存.
我很惊讶,因为我认为字典是最有效的方法.但是我的嘲笑表明字典需要比列表更多的内存.我在SO和其他地方阅读其他帖子表明,任何其他结构都需要比列表指针更昂贵的指针分配.我在这里遗漏了什么,是否有更好的方法来做到这一点?
在阅读了Alberto的回答并回复我的评论后,我花了一些时间试图弄清楚如果我使用数据库如何编写该函数.现在我可能会陷入困境,因为我对db编程知之甚少
我认为使用数据库实现的代码会比以下复杂得多:
outList=[]
massiveFile=open('theFile','r')
for identifier in sortedUserList
# I get the list and sort it by the key of the dictionary
identifierList=massiveFile[theDict[identifier]['beginPosit']:theDict[identifier]['endPosit']+1]
for item in identifierList:
if item.startswith(manipulation of the identifier)
outList.append(item)
Run Code Online (Sandbox Code Playgroud)
我必须将它包装在一个函数中,如果我将列表转换为数据库,我没有看到任何相对简单的函数.
当然,更简单的不是把我带到这个论坛的原因.我仍然没有看到使用其他结构将花费更少的内存.我有30000个公司标识符和大约3600个日期.我列表中的每个项目都是OOD用语中的对象.这就是我在挣扎的地方,今天早上我花了六个小时来组织字典的数据,然后才放弃.花费一定的时间来实现一个数据库,然后发现我正在使用半个或更多别人的内存加载它似乎有问题
我正在阅读一百多万个文件来删除一些数据.这些文件通常非常统一,但偶尔也会出现我希望找不到的东西.
例如,我希望一些sgml代码能够识别我需要的值
for data_line in temp #temp is a list of lines from a file
if <VARIABLENAME> in data_line:
VARIABLE_VAL=data_line.split('>')[-1]
Run Code Online (Sandbox Code Playgroud)
后来我用了VARIABLE_VAL.但我有时会得到一个例外:文件中没有行
<VARIABLENAME>theName
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我在处理完所有行后添加了这一行:
try:
if VARIABLE_VAL:
pass
except NameError:
VARIABLE_VAL=somethingELSE
Run Code Online (Sandbox Code Playgroud)
我已经看到了某个地方(但我找不到了)一个看起来像的解决方案
if not VARIABLE_VAL:
VARIABLE_VAL=somethingELSE
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激
我有一些使用lxml处理的标记数据.当我打开文件时,如果我有三种类型的元素中的一种或多种(我可以有一个,两个或三个不同的元素以及我所拥有的任何类型的多个实例),那么在打开文件之前我不知道
我需要有关元素的子标记中包含的这些元素的一些信息
<element_type_1>
<name>joe smith</name>
</element_type_1>
<element_type_2>
<name>mary smith</name>
</element_type_2>
<element_type_3>
<name>patrick smith</name>
</element_type_3>
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,我有三种类型,但每种类型只有一种,但是任何类型都可以有一些任意大量的数字.
我cssselect在我的函数中使用了3次来获取元素
def get_types(myTree):
type_dict=defaultdict(list)
type_dict['type_1']=myTree.cssselect('element_type_1')
type_dict['type_2']=myTree.cssselect('element_type_2')
type_dict['type_3']=myTree.cssselect('element_type_3')
ret type_dict
Run Code Online (Sandbox Code Playgroud)
这似乎过于冗余
我错过了一些可以清理这一点的东西吗?
仅供参考我这样做是因为对于每种类型,我必须匹配相关文档中的其他一些数据
早期的答案表明我需要澄清一点 - 我想避免三次穿过树
我正在运行以下代码:
from myUtilities import myObject
for year in range(2006,2015):
front = 'D:\\newFilings\\'
back = '\\*\\dirTYPE\\*.sgml'
path = front + str(year) + back
sgmlFilings = glob.glob(path)
for each in sgmlFilings:
header = myObject(each)
try:
tagged = header.process_tagged('G:')
except Exception as e:
outref = open('D:\\ProblemFiles.txt','a')
outref.write(each '\n')
outref.close()
print each
Run Code Online (Sandbox Code Playgroud)
如果我从重启开始,python的内存分配/消耗相当小.随着时间的推移,虽然它显着增加,并且最终在大约一天后我的可用内存很少(24GB安装[294 mb free 23960 cached])并且Python在Windows任务管理器列表中声称的内存为3GB.我正在观察在针对文件集合运行代码所需的三天内这种增加.
我的印象是,因为我正在做所有事情
tagged = header.process_tagged('G:')
Run Code Online (Sandbox Code Playgroud)
与每个循环相关联的内存将被释放并进行垃圾回收.
有什么我可以做的来强制释放这个记忆.虽然我还没有运行统计数据但我可以通过观察磁盘上的活动来判断该进程随着时间的推移而减慢(并且内存〜块变大)进展
编辑
我看了下面引用的问题,我不认为这些问题与我在另一个问题中理解的问题相同,即他们抓住对象(三角形列表)并需要整个列表进行计算.在每个循环中,我正在读取文件,执行文件的某些处理,然后将其写回磁盘.然后我正在阅读下一个文件...
关于可能的内存泄漏,我在myObject中使用LXML
注意,自从这个问题的第一次迭代以来,我添加了MyUtilities导入myObject的行.MyUtilities拥有可以完成所有任务的代码
关于发布myUtilities的代码 - 远离基本问题 - 我完成了标题并在标记每次迭代后标记了东西并将结果写入另一个驱动器,事实上是一个新格式化的驱动器.
我研究过使用多处理,但我没有因为一个模糊的想法,因为这是I/O密集型,我将竞争驱动器头 - 也许这是错误的,但因为每次迭代需要我写几百MB文件我认为我会竞争写入甚至读取时间.
更新 - 所以我在myObjectclass中有一个案例,其中打开了一个文件
myString = open(somefile).read()
我改变了
with open(somefile,'r') …
我正在尝试从一些 pdf 文档中提取一些内容。尽管我在 pdfminer 和 pymupdf 上投入最多,但我一直在尝试各种工具。我从 pdfminer 开始,但在无法解决一个特定问题后开始测试 pymupdf - 也就是说,当我的 pdf 文档有很多页时,我想选择是否处理每个特定页面。但是,我在使用这两个库时遇到的问题是,当我尝试从一个特定页面(或另一页面)检索文本时,返回的文本是文档中的所有文本。
这是一个有 57 页的文档的链接。
我这里重点介绍一下使用 pymupdf 的情况
这是一些代码
import fitz
doc = fitz.open('local_path_to_file_from_link_above')
for page in doc:
text = page.getText().encode("utf8")
break
Run Code Online (Sandbox Code Playgroud)
我在这里中断是为了确认我从一页且仅一页中提取了文本 - 但当我检查文本时,我发现它几乎包含整个文档(所有 57 页)的所有文本
所以我很好奇,尽管 pdf 文件中出现了页面边界 - 也许它们不存在,所以我使用 pageCount 属性/属性/方法来确定页面是否存在 - 它们似乎是
>>> doc.pageCount
57
Run Code Online (Sandbox Code Playgroud)
当我循环遍历所有页面时,描述输出有点困难,每个页面并不完全具有所有页面的所有内容,但它具有几乎所有内容。我通过使用以下代码确定了这一点
mydict = dict()
for n, page in doc:
print n, len(p.getText())
mydict[n] = p.getText()
Run Code Online (Sandbox Code Playgroud)
这是输出 - 为了完整性
0 45491
1 45491
2 45491
3 45491
4 …Run Code Online (Sandbox Code Playgroud) 我有一些 HTML 正在尝试解析。在某些情况下,单独的 html 属性不会帮助我识别行类型(标题与数据)。幸运的是,如果我的行是数据行,那么它应该有一些可以转换为整数的值。对于可以进行转换的那些情况,我已经想出了如何将 unicode 转换为整数。我正在努力编写逻辑以移过转换不起作用的单元格,因为该单元格具有必须被视为文本的内容。
例如,如果 rowColumn[1][3] 可以转换为整数,我可以这样做
int(rowColumn[1][3].replace(',','').strip('$'))
Run Code Online (Sandbox Code Playgroud)
但如果 rowColumn[1][3] 有文本内容,我会收到错误消息。
我一直使用一个非常简单的批处理文件从UNIX ftp服务器下载数百万个文件多年
login
passwd
ascii
prompt n
cd to the right directory
get some_file
get another_file
cd to the next directory
repeat the pattern
Run Code Online (Sandbox Code Playgroud)
关于这一点的好处是它很简单,并且所有文件都使用Window的换行符到达,因此文件已准备好与我现有的程序一起使用.由于我的路由器发生了一些变化,我不得不编写一个Python脚本来提取文件 - 我的第一个版本的脚本非常简单 - 但它的工作原理
for key in key_filings:
for filing in key_filings[key]:
remote_directory = '/foo/bar/' + key + '/' + filing['key_number']
ftp.cwd(remote_directory)
text_file = filing['txt']
ftp.retrlines('RETR '+ text_file, open(save_dir + text_file,'w').writelines)
hdr_file = filing['hdr']
ftp.retrlines('RETR ' + hdr_file, open(save_dir + hdr_file,'w').writelines)
Run Code Online (Sandbox Code Playgroud)
但是,文件没有任何明显的换行符.这些文件存储在unix系统中.在我使用Windows CMD shell下载文件之前,换行符就在那里.我已经尝试发送ASCII命令,但正如预期的那样没有任何影响.
至关重要的是,我能够访问最初存在的换行符,因为我的一些代码处理是基于行的.
我正在尝试学习如何使用 Python-click。我无法在我的选项之一中使用帮助参数,所以我最终放弃并更改了代码以不包含该选项的帮助。然而,尽管关闭并重新启动 Python,现在重新启动我的计算机,与尝试使用 help 参数相关的错误消息仍然出现。
import click
def something():
pass
@click.command()
@click.argument('dest_dir',type=click.Path(exists=True, readable=True,
resolve_path=True, dir_okay=True),
help='Location of directory where results will be saved')
@click.option('--use_terms', is_flag=True,
help='Process strings based on terms or phrases')
@click.option('--use_query', is_flag=True, help='Process string based on
search query')
@click.option('--search_phrase', '-s', multiple=True)
def do_process(dest_dir,use_terms,use_query,*search_phrase):
""" testing setting parameters for snip tables"""
outref = open('e:\\myTemp\\testq.txt')
ms = dest_dir + '\n'
if use_terms:
ms += use_term + '\n'
else:
ms += use_query + '\n'
for each in search_phrase:
x = …Run Code Online (Sandbox Code Playgroud) 我正在扫描大量文件,寻找一些标记.我开始非常有信心,一旦我完成代码,Python就不会重新读取磁盘中的实际文件.我发现这种行为很奇怪,因为我被告知我需要以我的方式构建文件访问的一个原因是刷新句柄和文件内容.但那不可能.
我正在阅读的列表中有9,568个文件路径.如果我关闭Python并重新启动计算机,则大约需要6分钟来读取文件并确定是否有正则表达式返回的内容.
但是,如果我第二次运行代码大约需要36秒.只是为了笑容,平均文件有53,000个单词.
因此,我得出结论,Python仍然可以访问它在第一次迭代中读取的文件.
我还想观察一下,我第一次这样做,我可以听到磁盘旋转(E:\ - Python在C :).E只是一个具有126 MB缓存的旋转磁盘 - 我认为缓存不足以容纳这些文件的内容.当我以后这样做时,我听不到磁盘旋转.
这是代码
import re
test_7A_re = re.compile(r'\n\s*ITEM\s*7\(*a\)*[.]*\s*-*\s*QUANT.*\n',re.IGNORECASE)
no7a = []
for path in path_list:
path = path.strip()
with open(path,'r') as fh:
string = fh.read()
items = [item for item in re.finditer(test_7A_re,string)]
if len(items) == 0:
no7a.append(path)
continue
Run Code Online (Sandbox Code Playgroud)
我关心这个有很多原因,一个是我在考虑使用多处理.但如果瓶颈在读取文件,我看不出我会获得多少收益.我也认为这是一个问题,因为我担心文件被修改,并且没有最新版本的文件可用.
我正在标记这个2.7因为我不知道这种行为是否在版本中是持久的.
为了确认这种行为,我修改了我的代码以作为.py文件运行,并添加了一些时序代码.然后我重新启动了我的计算机 - 第一次运行它需要5.6分钟而第二次(没有重启)时间是36秒.两种情况下的输出都相同.
真正有趣的是,即使关闭IDLE(但不重新启动计算机),运行代码仍需要36秒.
所有这些都告诉我,第一次没有从磁盘读取文件 - 这对我来说是一个惊人的行为,但它似乎很危险.
要清楚,结果是一样的 - 我相信我已经运行的时序测试以及我没有听到磁盘旋转的事实,不知何故文件仍可供Python访问.
python ×10
dictionary ×1
file ×1
ftplib ×1
integer ×1
list ×1
lxml ×1
memory ×1
newline ×1
pdf ×1
performance ×1
pymupdf ×1
python-2.7 ×1
python-click ×1
shutil ×1
text ×1
windows ×1