Python gzip - 提取.csv.gz 文件 - 内存错误

标签 python memory gzip extract memory-efficient

我尝试编写一个脚本来从 ftp 服务器访问 .csv.gz 文件,并将内容写入同一服务器上的 .csv 文件。只要文件小于 100mb,此方法似乎就可以正常工作,超过此大小就会失败,并出现内存错误。我无法找到一种方法来提取 .csv 文件,因此它会逐行读取文件内容(元组列表)并将其写入新文件。

是否有更有效的方法来执行此操作,或者甚至直接从 .csv.gz 文件中提取 .csv 文件?

def gz_unzipper():

    hostname = "servername"
    directory = "path"
    input_file = directory + "filename.csv.gz"
    output_file = directory + "filename.csv"
    ftp = FTP(hostname)
    ftp.login (username, password)
    ftp.cwd(directory)

    f = gzip.open(input_file, 'r')
    gz_content = f.read()

    lines=csv.reader(StringIO.StringIO(gz_content))

    output_file = open(output_file, 'w')

    for line in lines:
        line  = repr(line)[1:-1]
        line = line.replace("'","")
        line = line.replace(" ","")

        output_file.write(line + "\n") 

    output_file.close  
    f.close()

最佳答案

现在您正在一次读取整个文件,这对于小文件来说很好,但如果您有大量数据,(显然)会导致问题。由于您正在逐行处理文件,因此可以对文件/csv 文件使用内置的 Python 迭代器。这些通常被实现为惰性,这意味着它们仅在需要时读取数据。

尝试这样的事情(抱歉,未经测试):

with gzip.open(input_file, 'r') as fin, open(output_file,'w') as fout:
    csv_reader = csv.reader(fin)
    csv_writer = csv.writer(fout)
    csv_writer.writerows(csv_reader)

关于Python gzip - 提取.csv.gz 文件 - 内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8527063/

相关文章:

python - 执行 makemigrations 后,结果中缺少一些项目

python - 用于绘制 ROC 曲线的 libsvm

memory - ELF 入口点可以与通常的 0x80****** 不同吗?为什么要这样做?

c++ - 将一个数组的内容复制到另一个数组会导致内存泄漏吗

iis - 内容不是gzip时,请更改 header :ed on IIS 7 as origin for CDN

python - groupby.first() 和 groupby.head(1) 有什么区别?

python - 在python中找到两个列表之间匹配索引的最快方法?

string - 如何用更少的内存保存多个相似(分层格式)的字符串?

linux - 无法提取 tar.gz 文件

php - 在 mysql 中存储 gzip 字符串