Python gzip - извлечение файла .csv.gz - ошибка памяти - PullRequest
1 голос
/ 16 декабря 2011

Я попытался написать скрипт для доступа к файлу .csv.gz с ftp-сервера и записать содержимое в файл .csv на том же сервере.Этот метод, кажется, работает нормально, пока файл меньше 100 МБ, из-за того, что он терпит неудачу, вызывая ошибку памяти.Я не смог найти способ просто извлечь файл .csv, чтобы он читал содержимое файла (список кортежей) построчно и записывал его в новый файл.

Есть ли более эффективный способ сделать это или даже просто извлечь файл .csv непосредственно из файла .csv.gz?

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()

1 Ответ

2 голосов
/ 16 декабря 2011

Прямо сейчас вы читаете весь файл одновременно, что хорошо для небольших файлов, но (очевидно) вызывает проблемы, если у вас много данных.Поскольку вы имеете дело с файлом построчно, вы можете использовать встроенные итераторы Python для файлов / csvfiles.Они обычно реализуются как lazy , что означает, что они читают данные только тогда, когда им это нужно.

Попробуйте что-то вроде этого (извините, не проверено):

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)
...