Удалить строку из огромного CSV-файла в Python
У меня есть огромный (240 МБ) CSV-файл, в котором 2 верхние строки представляют собой ненужные данные. Я хочу удалить эти ненужные данные и использовать данные, начиная с этого момента.
Я хотел бы знать, каковы наилучшие варианты. Так как это большой файл, создание его копии и редактирование заняло бы много времени. Ниже CSV, например:
junk. . No,name,place,destination 1,abx,India,SA
No,name,place,destination 1,abx,India,SA
3 ответа
Просто выбросьте эти строки.
Используйте Dictreader для разбора заголовка
import csv with open("filename") as fp: fp.readline() fp.readline() csvreader = csv.DictReader(fp, delimiter=',') for row in csvreader: #your code here
Вы можете сделать это с хвостом довольно легко
Вы сказали, что верхние 3 строки, но пример удалил верхние 2?
Вы можете найти больше способов здесь
Из-за того, как работают файловые системы, вы не можете просто удалить строки из файла напрямую. Любой способ сделать это будет обязательно переписывать весь файл с удаленными ошибочными строками.
На всякий случай, перед удалением старого файла вы захотите временно сохранить новый файл, пока не убедитесь, что новый файл был успешно создан. И если вы хотите избежать чтения всего большого файла в память, вам нужно использовать генератор.
Вот генератор, который возвращает каждый элемент из итерируемого (такого как файловый объект) после того, как определенное количество элементов уже было возвращено:
def gen_after_x(iterable, x): # Python 3: yield from (item for index,item in enumerate(iterable) if index>=x) # Python 2: for index,item in enumerate(iterable): if index>=x: yield item
Чтобы упростить ситуацию, мы создадим функцию для записи временного файла:
def write_file(fname, lines): with open(fname, 'w') as f: for line in lines: f.write(line + '\n')
Нам также понадобится os.remove а также os.rename функции от os Модуль для удаления исходного файла и переименования временного файла. И нам понадобится copyfile от shutil сделать копию, чтобы мы могли безопасно удалить исходный файл.
Теперь, чтобы сложить все вместе:
from os import remove, rename from shutil import copyfile src_file = 'big_file' tmp_file = 'big_file_temp' skip = 2 with open(src_file) as fin: olines = gen_after_x(fin, skip) write_file(tmp_file, olines) src_file_copy = src_file + '_copy' copyfile(src_file, src_file_copy) try: remove(src_file) rename(tmp_file, src_file) remove(src_file_copy) except Exception: try: copyfile(src_file_copy, src_file) remove(src_file_copy) remove(tmp_file) except Exception: pass raise
Однако я хотел бы отметить, что 240 МБ в наши дни не такой большой файл; Вы можете найти это быстрее сделать это обычным способом, так как это сокращает количество повторяющихся операций записи на диск:
src_file = 'big_file' tmp_file = 'big_file_temp' skip = 2 with open(src_file) as f: lines = f.readlines() for _ in range(skip): lines.pop(0) with open(tmp_file, 'w') as f: f.write('\n'.join(lines)) src_file_copy = src_file + '_copy' copyfile(src_file, src_file_copy) try: remove(src_file) rename(tmp_file, src_file) remove(src_file_copy) except Exception: try: copyfile(src_file_copy, src_file) remove(src_file_copy) remove(tmp_file) except Exception: pass raise
. или, если вы предпочитаете более рискованный способ:
with open(src_file) as f: lines = f.readlines() for _ in range(skip): lines.pop(0) with open(src_file, 'w') as f: f.write('\n'.join(lines))
Как удалить строки в CSV?
мой код
мой вывод
Xion, ну, раз вы csv.reader используете для чтения файла, то логично в файл писать с помощью csv.writer.
with open('arm.csv', newline='') as File: with open('wdays_data.csv', mode='w') as wdays: reader = csv.reader(File) for row in reader: if row[0] in weekend_days: writer = csv.writer(wdays, delimiter=',') writer.writerows(row[0])
with open('import.csv', newline='') as source: reader = csv.DictReader(source) with open('export.csv', mode='w', encoding='utf-8-sig', newline='') as destination: writer = csv.DictWriter(destination, dialect=csv.unix_dialect, fieldnames=reader.fieldnames) writer.writeheader() writer.writerows( filter(lambda x: x.get('date') not in weekend_days, reader) )
Вопрос закрыт для ответов и комментариев
Как реализовать расчет определенных индикаторов торговли в реальном времени?
Как найти строку в CSV и удалить ее?
Мне необходимо найти строку со значением, к примеру «oops», после чего скопировать значение этой строки в переменную, а саму строку из CSV удалить. Как это можно сделать?
from typing import List, Tuple import csv SOURCE_CSV = 'source.csv' SUBSTR = 'ooops' COL_WITH_VALUES = 1 def main(): data = get_data_from_file(SOURCE_CSV) filtered_data, clone_rows = data_filter(data, SUBSTR, COL_WITH_VALUES) save_data(SOURCE_CSV, filtered_data) def save_data(file_path: str, rows: List[List[str]]): with open(file_path, 'w', newline='') as f: w = csv.writer(f) w.writerows(rows) def data_filter(rows: List[List[str]], subst: str, col: int) -> Tuple[List[List[str]], List[List[str]]]: filtered_data = [] clone_rows = [] for row in data: if row[col] == subst: rows_with_subst.append(row) else: filtered_data.append(row) return filtered_data, clone_rows def get_data_from_file(file_path: str) -> List[List[str]]: with open(SOURCE_CSV, 'r') as f: data = [x for x in csv.reader(f)] return data if __name__ == "__main__": main()
И что произойдет, когда не хватит памяти?
Тогда автор вопроса прибежит сюда снова с вопросом, что мне делать с файлом, который весит 100500гб или мой файл обрабатывается уже вторые сутки.
Ну так зачем тогда профи пишет код, который не пройдет volume тест? )
Меньше кода === меньше ошибок === лучше
Спасибо, поржал.
Давайте все и всё писать без функций, а ООП забудем как страшный сон. А все названия переменных я предлогаю соктратить до одного, ну ладно 2х, символов. А чтобы еще меньше писать, то давайте повсеместно использовать global и goto.
Дмитрий, вопрос решается парой-тройкой выражений-генераторов, как с объёмом кода, так и с использованием памяти.
Удаление столбцов и строчек в csv
Здравствуйте!
Подскажите пожалуйста как удалить первые три столбца и определенные строки, разделенные запятыми, в csv файле?
Названия столбцы не имеют.
Удаление строчек и столбцов матрицы заполненных только отрицательными элементами
Здравствуйте! Помогите пожалуйста заставить программу работать правильно! Задание: удалять со.
Размножить .csv файл с заменой 2 строчек
Камрады! Имеется .csv вот такой структуры LOT 22137D4UQV OPERATION T32-TEST-1-AMB 10 0.
Вывести номера строчек и столбцов
1. Дана квадратная целочисленная матрица С. Если в ней есть строки, со-стоящие из нулей, то.
Удаление строчек
Будьте добры, помогите новичку! Надо написать макрос, чтобы не листе удалялись строчки, в которыхь.
Читаешь файл, каждую строку перегоняешь в массив (через split или csv reader), берешь от этих массивов слайсы ([3:]), записываешь в файл (‘,’.join(row))
alex white, а можно пример кода.
Добавлено через 30 минут
with open('file.csv') as csvfile: csvv = csv.reader(csvfile, delimiter=',', quotechar='"') for row in csvv: print(','.join(row[3:]).split(")
Сообщение от New Life
Здравствуйте!
Подскажите пожалуйста как удалить первые три столбца и определенные строки, разделенные запятыми, в csv файле?
Названия столбцы не имеют.
Создаешь новый файл, читаешь старый и из него копируешь в новый то что интересует. Когда все завершил закрываешь файлы, удаляешь старый, переименовываешь новый.
Avazart, да, это все очевидно, вопрос был в другом.
Добавлено через 19 часов 41 минуту
alex white, как теперь удалить лишние строки в csv файле?
если данные в формате
_запятая_табуляция_значение_запятая
то выбираете первые три и удаляете, по строчно
пишите в НОВЫЙ файл
если данные в формате
_запятая_пробел_значение_запятая
то это сложнее =) так как в данных (если) встречаются фразы, могут возникать сложности и лучше разделитель делать запятую
Сообщение от New Life
Ну реально — все ж уже рассказали.
with open("test2.csv",newline='') as source,open("test22.csv", "w", newline='') as dest: reader = csv.reader(source, delimiter=';') writer = csv.writer(dest,delimiter=';') #for _ in range(3): next(reader) # так можно пропускать строки с начала файла в нужном количестве skip_lines = [1,4,6] # пропускаем выборочно: 1 4 и 6 строку for line,row in enumerate(reader,1): if line in skip_lines: continue writer.writerow(row[3:]) # пропускаем первые три столбца каждой строки
http://python.su/forum/topic/33192/?page=3 http://python.su/forum/topic/3. ost-181554 и ниже разбирали экспорт товаров из 1С из убитой вирусом базы
там ребята помогли собрать все в csv а затем обработать csv
примерно то же самое =) и у вас
Как сделать нумерацию столбцов и строчек в шахматной доске?
Вот код: import tkinter as tk number_of_rows = number_of_columns = int(input("Введите.
Удаление строчек из модели
Представим ситуацию — есть 10 предметов. Список этих предметов хранится в БД. Моя задача в том.
Удаление строчек с реестра
доброго времени суток. подскажите плз, как удалить определенное значене try
Найти наименьший элемент в каждой строчке таблицы, 10 строчек, 20 столбцов
Помогите найти наименьший элемент в каждой строчке таблицы, 10 строчек, 20 столбцов
Удаление ненужных строчек из файла
Создал такую програму, она должна удалять коментари из кода с++ который записаный в файле.
Удаление столбцов и строчек в csv
Здравствуйте!
Подскажите пожалуйста как удалить первые три столбца и определенные строки, разделенные запятыми, в csv файле?
Названия столбцы не имеют.
Удаление строчек и столбцов матрицы заполненных только отрицательными элементами
Здравствуйте! Помогите пожалуйста заставить программу работать правильно! Задание: удалять со.
Размножить .csv файл с заменой 2 строчек
Камрады! Имеется .csv вот такой структуры LOT 22137D4UQV OPERATION T32-TEST-1-AMB 10 0.
Вывести номера строчек и столбцов
1. Дана квадратная целочисленная матрица С. Если в ней есть строки, со-стоящие из нулей, то.
Удаление строчек
Будьте добры, помогите новичку! Надо написать макрос, чтобы не листе удалялись строчки, в которыхь.
Читаешь файл, каждую строку перегоняешь в массив (через split или csv reader), берешь от этих массивов слайсы ([3:]), записываешь в файл (‘,’.join(row))
alex white, а можно пример кода.
Добавлено через 30 минут
with open('file.csv') as csvfile: csvv = csv.reader(csvfile, delimiter=',', quotechar='"') for row in csvv: print(','.join(row[3:]).split(")
Сообщение от New Life
Здравствуйте!
Подскажите пожалуйста как удалить первые три столбца и определенные строки, разделенные запятыми, в csv файле?
Названия столбцы не имеют.
Создаешь новый файл, читаешь старый и из него копируешь в новый то что интересует. Когда все завершил закрываешь файлы, удаляешь старый, переименовываешь новый.
Avazart, да, это все очевидно, вопрос был в другом.
Добавлено через 19 часов 41 минуту
alex white, как теперь удалить лишние строки в csv файле?
если данные в формате
_запятая_табуляция_значение_запятая
то выбираете первые три и удаляете, по строчно
пишите в НОВЫЙ файл
если данные в формате
_запятая_пробел_значение_запятая
то это сложнее =) так как в данных (если) встречаются фразы, могут возникать сложности и лучше разделитель делать запятую
Сообщение от New Life
Ну реально — все ж уже рассказали.
with open("test2.csv",newline='') as source,open("test22.csv", "w", newline='') as dest: reader = csv.reader(source, delimiter=';') writer = csv.writer(dest,delimiter=';') #for _ in range(3): next(reader) # так можно пропускать строки с начала файла в нужном количестве skip_lines = [1,4,6] # пропускаем выборочно: 1 4 и 6 строку for line,row in enumerate(reader,1): if line in skip_lines: continue writer.writerow(row[3:]) # пропускаем первые три столбца каждой строки
http://python.su/forum/topic/33192/?page=3 http://python.su/forum/topic/3. ost-181554 и ниже разбирали экспорт товаров из 1С из убитой вирусом базы
там ребята помогли собрать все в csv а затем обработать csv
примерно то же самое =) и у вас
Как сделать нумерацию столбцов и строчек в шахматной доске?
Вот код: import tkinter as tk number_of_rows = number_of_columns = int(input("Введите.
Удаление строчек из модели
Представим ситуацию — есть 10 предметов. Список этих предметов хранится в БД. Моя задача в том.
Удаление строчек с реестра
доброго времени суток. подскажите плз, как удалить определенное значене try
Найти наименьший элемент в каждой строчке таблицы, 10 строчек, 20 столбцов
Помогите найти наименьший элемент в каждой строчке таблицы, 10 строчек, 20 столбцов
Удаление ненужных строчек из файла
Создал такую програму, она должна удалять коментари из кода с++ который записаный в файле.