Создать список номеров

Привет, я хочу создать список чисел от 1000000 до 2000000, но проблема в том, что я получаю ошибку памяти ошибки, я использовал случайные, все было хорошо, только я получаю дублированное число, и я не могу иметь дублированное число, поэтому я переключился на xrange

data = []
total = 2000000
def resource_file(info):
    with open(info, "r") as data_file:
        reader = csv_reader(data_file, delimiter=",")
        for row in reader:
            try:
                for i in xrange(1000000,total):
                    new_row = [row[0], row[1], i]
                    data.append(new_row)
            except IndexError as error:
                print(error)
    with open(work_dir + "new_data.csv", "w") as new_data:
        writer = csv_writer(new_data, delimiter=",")
        for new_row in data:
            writer.writerow(new_row)

1 ответ

Повторите каждую строку с дополнительным столбцом в диапазоне 1M..2M

Проблема в том, что вы сначала сохраняете все эти конфигурации в памяти. First of Python имеет не очень эффективную модель памяти, и, кроме того, миллион записей в строке в любом случае достаточно велик.

Я предлагаю не хранить данные в списке, а просто сразу записать их в файл:

total = 2000000
def resource_file(info):
    with open(info, "r") as data_file:
        reader = csv_reader(data_file, delimiter=",")
        with open(work_dir + "new_data.csv", "w") as new_data:
            writer = csv_writer(new_data, delimiter=",")
            for row in reader:
                rowa, rowb = row[0:2]
                for data in xrange(1000000,total):
                    writer.writerow([rowa,rowb,data])

Взять строки 1М-2М файла

Если вы хотите взять строки от 1M до 2M исходного файла, вы можете записать его как:

from itertools import islice

total = 2000000
def resource_file(info):
    with open(info, "r") as data_file:
        reader = csv_reader(data_file, delimiter=",")
        with open(work_dir + "new_data.csv", "w") as new_data:
            writer = csv_writer(new_data, delimiter=",")
            for row in islice(reader,1000000,total):
                writer.writerow(row)

или вы можете упростить это, как говорит @JonClemens, с помощью:

from itertools import islice

total = 2000000
def resource_file(info):
    with open(info, "r") as data_file:
        reader = csv_reader(data_file, delimiter=",")
        with open(work_dir + "new_data.csv", "w") as new_data:
            writer = csv_writer(new_data, delimiter=",")
            writer.writerows(islice(reader,1000000,total))
Другие вопросы по тегам