Удалить строку из BIG CSV файла Python - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть 11GB CSV-файл, в котором есть несколько поврежденных строк, которые я должен удалить, я определил номера поврежденных строк из интерфейса ETL.

Моя программа работает с небольшими наборами данных, однако, когда я хочу запустить основной файл, я получаю MemoryError. Ниже кода, который я использую. Есть ли у вас какие-либо предложения, чтобы заставить его работать?

row_to_delete = 101068
filename = "EKBE_0_20180907_065907 - Copy.csv"
with open(filename, 'r', encoding='utf8' ,errors='ignore') as file:
    data = file.readlines()
    print(data[row_to_delete -1 ])
    data [row_to_delete -1] = ''
with open(filename, 'wb',encoding="utf8",errors='ignore') as file:
    file.writelines( data )

Ошибка:

Traceback (most recent call last):
  File "/.PyCharmCE2018.2/config/scratches/scratch_7.py", line 7, in <module>
    data = file.readlines()
MemoryError

1 Ответ

0 голосов
/ 09 сентября 2018

Вместо того, чтобы читать весь список в память, переберите входной файл и запишите все строки , за исключением строки, которую необходимо удалить, в новый файл. Используйте enumerate(), чтобы сохранить счетчик, если вам нужно удалить по индексу:

row_to_delete = 101068
filename = "EKBE_0_20180907_065907 - Copy.csv"
with open(filename, 'r', encoding='utf8', errors='ignore') as inputfile,\
     open(filename + '.fixed', 'wb', encoding="utf8") as outputfile:
    for index, line in enumerate(inputfile):
        if index == row_to_delete:
            continue  # don't write the line that matches
        outputfile.writeline(line)

Вместо того, чтобы использовать индекс, вы могли бы даже таким образом обнаружить плохую строку в коде.

Обратите внимание, что это записывает в новый файл с тем же именем, но с добавленным .fixed.

Вы можете переместить этот файл обратно, чтобы заменить старый файл, если хотите, на os.rename(), как только вы закончили копировать все, кроме плохой строки:

os.rename(filename + '.fixed', filename)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...