相关疑难解决方法(0)

Pythonic忽略循环控制变量的方法

我正在编写的Python程序是从文件顶部读取一定数量的行,程序需要保留此标题以备将来使用.目前,我正在做类似以下的事情:

header = ''
header_len = 4
for i in range(1, header_len):
    header += file_handle.readline()
Run Code Online (Sandbox Code Playgroud)

Pylint抱怨说我没有使用变量i.什么是更pythonic方式来做到这一点?

编辑:程序的目的是智能地将原始文件拆分为较小的文件,每个文件包含原始标题和数据的子集.因此,在读取文件的其余部分之前,我需要读取并保留标题.

python

14
推荐指数
3
解决办法
7562
查看次数

如何在Python中打开文件后释放内存

我在Python中打开一个3 GB的文件来读取字符串.然后我将这些数据存储在字典中.我的下一个目标是使用这个字典构建一个图形,所以我正在密切监视内存使用情况.

在我看来,Python将整个3 GB文件加载到内存中,我无法摆脱它.我的代码看起来像这样:

with open(filename) as data:

    accounts = dict()

    for line in data:
        username = line.split()[1]
        IP = line.split()[0]

        try:
            accounts[username].add(IP)
        except KeyError:
            accounts[username] = set()
            accounts[username].add(IP)

print "The accounts will be deleted from memory in 5 seconds"
time.sleep(5)
accounts.clear()

print "The accounts have been deleted from memory"
time.sleep(5)

print "End of script"
Run Code Online (Sandbox Code Playgroud)

最后一行是在那里,以便我可以监视内存使用情况.该脚本在内存中使用超过3 GB的位.清除字典可以释放大约300 MB.当脚本结束时,释放剩余的内存.

我正在使用Ubuntu,我使用"系统监视器"和终端中的"免费"命令监视内存使用情况.

我不明白的是为什么在我清除字典之后Python需要这么多内存.文件是否仍存储在内存中?如果是这样,我怎么能摆脱它呢?我的操作系统没有看到释放内存的问题吗?

编辑:我已经尝试在清除字典后强行执行gc.collect(),但无济于事.

EDIT2:我在Ubuntu 12.04.LTS上运行Python 2.7.3

EDIT3:我意识到我忘了提到一些非常重要的东西.我真正的问题不在于我的操作系统没有"取回"Python使用的内存.后来,Python似乎没有重用那个内存(它只是要求操作系统有更多的内存).

python memory file-io large-files

14
推荐指数
2
解决办法
1万
查看次数

从shutil文件复制线程获取进度

我有一个应用程序从中复制文件srcdst:

import shutil
from threading import Thread

t = Thread(target=shutil.copy, args=[ src, dst ]).start()
Run Code Online (Sandbox Code Playgroud)

我希望应用程序每隔5秒查询一次副本的进度,而不会锁定应用程序本身.这可能吗?

我的目的是将此进度设置为a QtGui.QLabel以向用户提供有关文件副本的反馈.

使用线程shutil文件副本进行复制时可以实现吗?

python multithreading

14
推荐指数
3
解决办法
1万
查看次数

请求 - 如何流上传 - 部分文件

我的目标是使用请求对文件的一部分进行PUT并流式传输文件(即,不将其加载到内存中然后执行PUT).

此页面说明了如何为整个文件执行此操作:

请求支持流式上传,允许您发送大型流或文件而无需将其读入内存.要进行流式传输和上传,只需为您的身体提供类似文件的对象:

with open('massive-body', 'rb') as f:
    requests.post('http://some.url/streamed', data=f)
Run Code Online (Sandbox Code Playgroud)

但是在我的情况下,我只想发送一个文件块.有没有办法实现这个目标?

在概念上,类似于:

with open('massive-body', 'rb') as f:
    requests.post('http://some.url/streamed', data=f.read(chunksize))
Run Code Online (Sandbox Code Playgroud)

python python-requests

13
推荐指数
2
解决办法
8743
查看次数

以块为单位处理比物理内存大得多的数据

我需要处理一些比RAM大几百倍的数据.我想在大块中读取,处理它,保存结果,释放内存并重复.有没有办法在python中提高效率?

python chunks

10
推荐指数
1
解决办法
5969
查看次数

Joblib 内存使用量不断增长

我有以下问题。我的目的是处理一堆文档(将所有单词转换为正常形式,例如 'was' --> 'be', 'were' --> 'be', 'went' --> 'go')。这意味着,我需要打开目录中的每个文件,更改其内容并将其保存在另一个目录中。
由于这个过程很耗时,我决定在joblib的帮助下进行并行处理。下面的代码可以正常工作(我的意思是,它执行了它必须执行的操作),但是我遇到了一个巨大的内存问题。
它一直在不断增长!
它会一直增长,直到服务器上根本没有剩余内存。

from joblib import delayed, Parallel

def process_text(text):
    # some function which processes
    # text and returns a new text
    return processed_text


def process_and_save(document_id):
    with open(path + document_id) as f:
        text = f.read()
    text = process_text(text)
    f = open(other_path + document_id, 'w')
    f.write(text)
    f.close()

all_doc_ids = # a list of document ids which I need to process

Parallel(n_jobs=10)(delayed(process_and_save)(doc_id) for doc_id in all_doc_ids)
Run Code Online (Sandbox Code Playgroud)

我还尝试将 joblib 更改为 multipricessing:

pool = …
Run Code Online (Sandbox Code Playgroud)

memory parallel-processing pool python-2.7 joblib

7
推荐指数
1
解决办法
1937
查看次数

在python中读取大csv文件的行

我有一个非常大的 csv 文件,无法完全加载到内存中。所以我想一块一块地读取它,将它转换成 numpy 数组,然后再做一些处理。

我已经检查过: Lazy Method for Reading Big File in Python?

但这里的问题是它是一个普通的阅读器,我无法在 csvReader 中找到任何指定大小的选项。

此外,由于我想将行转换为 numpy 数组,因此我不想将任何行读成两半,所以我想要一些可以在阅读器中指定“行数”的东西,而不是指定大小。

是否有任何内置功能或简单的方法来做到这一点。

python csv file-io generator

5
推荐指数
1
解决办法
2105
查看次数

Scrapy - 输出到多个 JSON 文件

我对 Scrapy 很陌生。我正在考虑使用它来抓取整个网站的链接,在其中我会将项目输出到多个 JSON 文件中。因此,我可以将它们上传到 Amazon Cloud Search 以进行索引。是否可以将项目拆分为多个文件而不是最终只有一个大文件?根据我的阅读,项目导出器只能输出到每个蜘蛛的一个文件。但我只使用一个 CrawlSpider 来完成这项任务。如果我可以对每个文件中包含的项目数量设置一个限制,比如 500 或 1000,那就太好了。

这是我到目前为止设置的代码(基于教程中使用的 Dmoz.org):

dmoz_spider.py

import scrapy

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from tutorial.items import DmozItem

class DmozSpider(CrawlSpider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/",
    ]

    rules = [Rule(LinkExtractor(), callback='parse_item', follow=True)]

    def parse_item(self, response):
       for sel in response.xpath('//ul/li'):
            item = DmozItem()
            item['title'] = sel.xpath('a/text()').extract()
            item['link'] = sel.xpath('a/@href').extract()
            item['desc'] = sel.xpath('text()').extract()
            yield item
Run Code Online (Sandbox Code Playgroud)

项目.py

import scrapy

class DmozItem(scrapy.Item):
    title = scrapy.Field()
    link …
Run Code Online (Sandbox Code Playgroud)

python json scrapy

5
推荐指数
1
解决办法
3116
查看次数

允许用户播放mp3文件,但不要直接在网络上公开

我想将一些mp3存储在一个没有公开的文件夹中,不能通过网络直接访问,并允许用户只有在登录后才能通过浏览器收听/下载歌曲.

我怎样才能做到这一点 ?

我用django进行web开发,但如果我知道它是如何工作就足够了.

django mediaelement media-player

4
推荐指数
1
解决办法
1417
查看次数

Python汇总文件中的频率

我有一个大文件(950MB),它具有以下单词和频率,每行一个:

word1 54

word2 1

word3 12

word4 3

word1 99

word4 147

word1 4

word2 6

等等...

我需要对单词的频率求和,例如word1 = 54 + 99 + 4 = 157,并将其输出到列表/文件.在Python中执行此操作的最有效方法是什么?

我试图做的是创建一个列表,每一行都是这个列表中的一个元组,从那里总结,这使我的笔记本电脑崩溃了......

python sum file frequency cpu-word

4
推荐指数
1
解决办法
366
查看次数