Усеченные строки Python, поскольку они читаются

Ответ Дрю довольно хорошо показывает, что += с массивами в PowerShell не работает; Вы уже нашли причину в своем вопросе (каждый раз создается новый массив, копируются все элементы и т. д.).

Обратите внимание, что ArrayList - не единственная альтернатива. Иногда просто изменить способ, которым вы делаете вещи, будет большая разница; например, циклы и итерации распространены в PowerShell, и создание массива выходных данных по присваиванию очень быстро, а также, на мой взгляд, лучше синтаксис.

Сравните это (2s 406ms):

Measure-Command -Expression {
    $a = @()
    1..10000 | % { $a += 

Ответ Дрю довольно хорошо показывает, что += с массивами в PowerShell не работает; Вы уже нашли причину в своем вопросе (каждый раз создается новый массив, копируются все элементы и т. д.).

Обратите внимание, что ArrayList - не единственная альтернатива. Иногда просто изменить способ, которым вы делаете вещи, будет большая разница; например, циклы и итерации распространены в PowerShell, и создание массива выходных данных по присваиванию очень быстро, а также, на мой взгляд, лучше синтаксис.

Сравните это (2s 406ms):

[110]

с этим (60ms):

Measure-Command -Expression {
    $a = 1..10000 | % { 

Ответ Дрю довольно хорошо показывает, что += с массивами в PowerShell не работает; Вы уже нашли причину в своем вопросе (каждый раз создается новый массив, копируются все элементы и т. д.).

Обратите внимание, что ArrayList - не единственная альтернатива. Иногда просто изменить способ, которым вы делаете вещи, будет большая разница; например, циклы и итерации распространены в PowerShell, и создание массива выходных данных по присваиванию очень быстро, а также, на мой взгляд, лучше синтаксис.

Сравните это (2s 406ms):

[110]

с этим (60ms):

[111]*2 } }
*2 } }

с этим (60ms):

Measure-Command -Expression {
    $a = 1..10000 | % { 

Ответ Дрю довольно хорошо показывает, что += с массивами в PowerShell не работает; Вы уже нашли причину в своем вопросе (каждый раз создается новый массив, копируются все элементы и т. д.).

Обратите внимание, что ArrayList - не единственная альтернатива. Иногда просто изменить способ, которым вы делаете вещи, будет большая разница; например, циклы и итерации распространены в PowerShell, и создание массива выходных данных по присваиванию очень быстро, а также, на мой взгляд, лучше синтаксис.

Сравните это (2s 406ms):

[110]

с этим (60ms):

[111]*2 } }

12
задан Ryan White 8 February 2009 в 08:48
поделиться

6 ответов

Удалите все строки после выполнения с ними:

with open('myfile.txt', 'r+') as file:
    for line in file:
        processLine(line)
    file.truncate(0)

Удалите каждую строку независимо:

lines = open('myfile.txt').readlines()

for line in lines[::-1]: # process lines in reverse order
    processLine(line)
    del lines[-1]  # remove the [last] line

open('myfile.txt', 'w').writelines(lines)

Можно оставить только те строки, которые вызывают исключения:

import fileinput

for line in fileinput.input(['myfile.txt'], inplace=1):
    try: processLine(line)
    except Exception:
         sys.stdout.write(line) # it prints to 'myfile.txt'

В целом, как другие люди уже сказали, это - плохая идея, что Вы пытаетесь сделать.

18
ответ дан 2 December 2019 в 03:25
поделиться

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

try :
    for index, line in enumerate(file) :
        processLine(line)
except :
    # Failed, start from this line number next time.
    print(index)
    raise
6
ответ дан 2 December 2019 в 03:25
поделиться

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

Как насчет того, чтобы иметь Ваш сценарий печатают номер строки, на котором он повреждается, и иметь его берут номер строки в качестве параметра, таким образом, можно сказать его который строка начать обрабатывать от?

4
ответ дан 2 December 2019 в 03:25
поделиться

В первую очередь, вызов операции truncate вероятно, не лучший выбор. Если я понимаю проблему правильно, Вы хотите удалить все до текущей позиции в файле. (Я ожидал бы truncate сокращать все из текущей позиции в конец файла. Это то, как стандартный Python truncate работы метода, по крайней мере, если я Погугленный правильно.)

Во-вторых, я не уверен, что мудро изменить файл при итерации на в использовании for цикл. Разве не было бы лучше сохранить количество обработанных строк и удалить их после того, как основной цикл закончился, исключение или нет? Итератор файла поддерживает оперативную фильтрацию, что означает, что должно быть довольно просто отбросить обработанные строки впоследствии.

P.S. Я не знаю Python, беру это с мелкой частицей соли.

4
ответ дан 2 December 2019 в 03:25
поделиться

Вы не можете. Это просто не возможно с фактическими реализациями текстового файла в текущих файловых системах.

Текстовые файлы последовательны, потому что строки в текстовом файле могут иметь любую длину. Удаление конкретной строки означало бы переписывать весь файл от той точки на.

Предположим, что у Вас есть файл со следующими 3 строками;

'line1\nline2reallybig\nline3\nlast line'

Для удаления второй строки, необходимо было бы переместить положения третьих и четвертых строк в диск. Единственный путь состоял бы в том, чтобы сохранить третьи и четвертые строки где-нибудь, усечь файл на второй строке и переписать недостающие строки.

Если Вы знаете размер каждой строки в текстовом файле, можно усечь файл в любом использовании положения .truncate(line_size * line_number) но даже затем необходимо было бы переписать все после строки.

9
ответ дан 2 December 2019 в 03:25
поделиться

В связанном сообщении есть хорошая стратегия для этого, см. Как запустить первый процесс из списка процессов, хранящихся в файле, и немедленно удалить первую строку, как если бы файл был очередью, и я вызвал «pop»?

Я использовал его следующим образом:

  import os;

  tasklist_file = open(tasklist_filename, 'rw');  
  first_line = tasklist_file.readline();
  temp = os.system("sed -i -e '1d' " + tasklist_filename); # remove first line from task file;

Я не уверен, что он работает в Windows. { {1}} Попробовал на Mac, и это помогло.

2
ответ дан 2 December 2019 в 03:25
поделиться
Другие вопросы по тегам:

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