我尝试编写一个脚本来从 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/