Как считать вход до EOF в Lisp

Этот разделяет файл новыми строками и записывает его обратно. Можно изменить разделитель легко. Это может также обработать неровные суммы также, если у Вас нет нескольких splitLen строк (20 в этом примере) в Вашем входном файле.

splitLen = 20         # 20 lines per file
outputBase = 'output' # output.1.txt, output.2.txt, etc.

# This is shorthand and not friendly with memory
# on very large files (Sean Cavanagh), but it works.
input = open('input.txt', 'r').read().split('\n')

at = 1
for lines in range(0, len(input), splitLen):
    # First, get the list slice
    outputData = input[lines:lines+splitLen]

    # Now open the output file, join the new slice with newlines
    # and write it out. Then close the file.
    output = open(outputBase + str(at) + '.txt', 'w')
    output.write('\n'.join(outputData))
    output.close()

    # Increment the counter
    at += 1
8
задан Joshua Taylor 5 September 2013 в 02:53
поделиться

2 ответа

строка чтения принимает необязательный аргумент ( eof-error-p ), позволяющий вернуть либо NIL (по умолчанию), либо указанное пользователем значение ( eof-value ) при попадании в EOF вместо сообщения об ошибке.

Из Главы 19 Успешного Лиспа :

] READ-LINE и необязательный поток eof-error-p eof-value recursive-p

В перечисленных выше функциях чтения необязательные аргументы EOF-ERROR-P и EOF-VALUE укажите, что происходит, когда ваша программа пытается читать из исчерпанного потока. Если EOF-ERROR-P истинно (по умолчанию), то Lisp сообщит об ошибке при попытке прочитать исчерпанный поток. Если EOF-ERROR-P равен NIL, тогда Lisp возвращает EOF-VALUE (по умолчанию NIL ) вместо сообщения об ошибке.

Вы можете использовать это как простое условие завершения вашей функции.

10
ответ дан 5 December 2019 в 06:54
поделиться

См. HyperSpec для READ-LINE

(loop for line = (read-line stream nil :eof) ; stream, no error, :eof value
      until (eq line :eof)
      do ... )

или иногда с nil

(loop for line = (read-line stream nil nil)
      while line
      do ... )
14
ответ дан 5 December 2019 в 06:54
поделиться