Эффективный способ удалить строку из текстового файла

Вы можете присвоить переменные результату вызова values ​​():

>>> d = {"a": 1, "b": 2, "c": 3}
>>> a,b,c = d.values()
>>> a
1
>>> b
2
>>> c
3

Я не рекомендую делать это для версий Python, где не требуется порядок сортировки, но, к счастью, это должно сработать в 3.6 и выше.

10
задан John Saunders 5 May 2010 в 19:11
поделиться

6 ответов

Самый прямой способ сделать это является, вероятно, лучшим, выпишите весь файл в новый файл, пишущий все строки кроме одной (s), Вы не хотите.

С другой стороны, откройте файл для произвольного доступа.

Читайте до такой степени, когда, Вы хотите "удалить" строку. Пропустите мимо строки, чтобы удалить, и считать то число байтов (включая CR + LF - при необходимости), записать, что число байтов по удаленной строке, усовершенствуйте оба места тем количеством байтов и повторения до конца файла.

Надеюсь, это поможет.

РЕДАКТИРОВАНИЕ - Теперь, когда я вижу Ваш код

if (!_deletedLines.Contains(counter)) 
{                            
    writer.WriteLine(reader.ReadLine());                        
}

Не будет работать, если это будет строка, Вы не хотите, Вы все еще хотите считать его, просто не пишут это. Вышеупомянутый код ни не считает его или запишет его. Новый файл будет точно тем же как старым.

Вы хотите что-то как

string line = reader.ReadLine();
if (!_deletedLines.Contains(counter)) 
{                            
    writer.WriteLine(line);                        
}
10
ответ дан 3 December 2019 в 23:15
поделиться

Текстовые файлы последовательны, поэтому при удалении строки, необходимо будет переместить все следующие строки вверх. Можно использовать отображение файла (win32 api, который можно назвать через PInvoke) сделать эту операцию немного менее болезненной, но Вы, конечно, должны, использование considere не последовательной структуры для Вас регистрирует так, чтобы можно было отметить строку, как удалено, действительно не удаляя его из файла... Особенно, если это должно произойти frenquently.

Если я имею, помнят, что API Отображения Файла должен быть добавлен к.Net 4.

3
ответ дан 3 December 2019 в 23:15
поделиться

Переместите Вас, файл к памяти с помощью Отображения Файла, как Думает, Прежде чем Кодирование сделало и сделало удаления на памяти и после записи к диску.
Считайте этот Сравнительные тесты чтения файла - C#
C#, получающий доступ к файлу карты распределения памяти

0
ответ дан 3 December 2019 в 23:15
поделиться

Если Вы абсолютно должны использовать текстовый файл и не можете переключиться на базу данных, возможно, Вы хотите определять странный символ в начале строки означать "удаленную строку". Просто имейте свой синтаксический анализатор, игнорируют те строки, как строки комментария в файлах конфигурации и т.д.

Затем имейте периодическую "компактную" стандартную программу как Outlook, и большинство систем баз данных делает, который переписывает весь файл, исключая удаленные строки.

Я сильно пошел бы с, Думают Перед ответом Кодирования, рекомендующим базу данных или другой структурированный файл.

0
ответ дан 3 December 2019 в 23:15
поделиться

В зависимости от того, что точно рассчитывает как "удаление", Ваше лучшее решение может состоять в том, чтобы перезаписать незаконную строку с пробелами. Во многих целях (включая потребление человеком), это эквивалентно удалению строки напрямую. Если получающаяся пустая строка является проблемой, и Вы уверены, что никогда не будете удалять первую строку, можно добавить пробелы к предыдущей строке, также перезаписав CRLF с двумя пробелами.

(На основе комментария к ответу Bork Blatt)

0
ответ дан 3 December 2019 в 23:15
поделиться

Прочтите файл в словарь в строках без удаления, установите для int значение 0 в строке, которую необходимо пометить как удаленную, установите для int значение 1. Используйте KeyValuePair для извлечения {{ 1}} строки, которые не нужно удалять, и записать их в новый файл.

Dictionary<string, int> output = new Dictionary<string, int>();

// read line from file

...

// if need to delete line then set int value to 1

// otherwise set int value to 0
if (deleteLine)
{
    output[line] = 1;
}
else
{
    output[line] = 0;
}

// define the no delete List
List<string> nonDeleteList = new List<string>();

// use foreach to loop through each item in nonDeleteList and add each key
// who's value is equal to zero (0) to the nonDeleteList.
foreach (KeyValuePair<string, int> kvp in output)
{

    if (kvp.Value == 0)

    {

        nonDeleteList.Add(kvp.Key);

    }
}

// write the nondeletelist to the output file
File.WriteAllLines("OUTPUT_FILE_NAME", nonDeleteList.ToArray());

Вот и все.

-1
ответ дан 3 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: