Lua прочитать файл построчно
Библиотека ввода / вывода используется для чтения и управления файлами в Lua. В Lua существует два вида файловых операций, а именно неявные файловые дескрипторы и явные файловые дескрипторы.
Для следующих примеров мы будем использовать пример файла test.lua, как показано ниже.
Простая операция открытия файла использует следующее утверждение.
Различные режимы файлов перечислены в следующей таблице.
Режим только для чтения. Это режим по умолчанию, в котором открывается существующий файл.
Режим записи включен, который перезаписывает существующий файл или создает новый файл.
Режим добавления, который открывает существующий файл или создает новый файл для добавления.
Режим чтения и записи для существующего файла.
Все существующие данные удаляются, если файл существует или создается новый файл с разрешениями на чтение и запись.
Режим добавления с включенным режимом чтения, который открывает существующий файл или создает новый файл.
Режим только для чтения. Это режим по умолчанию, в котором открывается существующий файл.
Режим записи включен, который перезаписывает существующий файл или создает новый файл.
Режим добавления, который открывает существующий файл или создает новый файл для добавления.
Режим чтения и записи для существующего файла.
Все существующие данные удаляются, если файл существует или создается новый файл с разрешениями на чтение и запись.
-- Opens a file in read file = io . open ( "test.lua" , "r" ) -- sets the default input file as test . lua io . input ( file ) -- prints the first line of the file print ( io . read ()) -- closes the open file io . close ( file ) -- Opens a file in append mode file = io . open ( "test.lua" , "a" ) -- sets the default output file as test . lua io . output ( file ) -- appends a word test to the last line of the file io . write ( "-- End of the test.lua file" ) -- closes the open file io . close ( file )Когда вы запустите программу, вы получите вывод первой строки файла test.lua. Для нашей программы мы получили следующий вывод.
Читает из текущей позиции файла и возвращает число, если существует в позиции файла или возвращает ноль.
Возвращает все содержимое файла из текущей позиции файла.
Читает строку из текущей позиции файла и перемещает позицию файла на следующую строку.
Читает количество байтов, указанных в функции.
Читает из текущей позиции файла и возвращает число, если существует в позиции файла или возвращает ноль.
Возвращает все содержимое файла из текущей позиции файла.
Читает строку из текущей позиции файла и перемещает позицию файла на следующую строку.
Читает количество байтов, указанных в функции.
Другие распространенные методы ввода / вывода включают в себя:
Явные файловые дескрипторы
Мы часто используем явный файловый дескриптор, который позволяет нам манипулировать несколькими файлами одновременно. Эти функции очень похожи на неявные файловые дескрипторы. Здесь мы используем file: function_name вместо io.function_name. Следующий пример версии файла того же самого примера неявных файловых дескрипторов показан ниже.
Когда вы запустите программу, вы получите вывод, аналогичный примеру неявных дескрипторов.
Все режимы открытия файлов и параметров для чтения для внешних дескрипторов такие же, как и для неявных файловых дескрипторов.
Другие распространенные файловые методы включают в себя:
Пример использования метода поиска показан ниже. Он смещает курсор от 25 позиций до конца файла. Функция чтения печатает остаток файла с позиции поиска.
Вы получите вывод, похожий на следующий.
Вы можете поэкспериментировать со всеми различными режимами и параметрами, чтобы узнать все возможности операций с файлами Lua.
Библиотека ввода-вывода Lua используется для чтения и обработки файлов. Разделены на простой режим (такой же, как C) и полный режим.
- Простая модель имеет текущий входной файл и текущий выходной файл и предоставляет операции, связанные с этими файлами.
- Полная модель реализована с использованием внешнего дескриптора файла. Он определяет все файловые операции как методы обработки файлов в объектно-ориентированной форме.
Простой режим больше подходит для выполнения простых файловых операций. Но при выполнении некоторых расширенных операций с файлами простой режим оказывается неадекватным. Например, для таких операций, как одновременное чтение нескольких файлов, больше подходит полный режим.
Оператор операции с открытым файлом выглядит следующим образом:
Режим | описание |
---|---|
r | Чтобы открыть файл только для чтения, файл должен существовать. |
w | Откройте файл только для записи.Если файл существует, длина файла сбрасывается до 0, то есть содержимое файла исчезает. Если файл не существует, создайте файл. |
a | Откройте файл только для записи в режиме добавления. Если файл не существует, он будет создан.Если файл существует, записанные данные будут добавлены в конец файла, то есть исходное содержимое файла будет сохранено. (Символ EOF зарезервирован) |
r+ | Чтобы открыть файл в режиме чтения-записи, файл должен существовать. |
w+ | Откройте файл, доступный для чтения и записи.Если файл существует, длина файла сбрасывается до нуля, то есть содержимое файла исчезает. Если файл не существует, создайте файл. |
a+ | Подобен a, но этот файл доступен для чтения и записи. |
b | Двоичный режим, если файл является двоичным файлом, вы можете добавить b |
+ | Знак указывает, что файл можно читать или писать |
Простой режим
В простом режиме используется стандартный ввод-вывод или текущий входной файл и текущий выходной файл.
Ниже приведен код файла file.lua, файл, с которым нужно работать, - test.lua (если у вас его нет, вам нужно создать файл), код выглядит следующим образом:
Выполнив приведенный выше код, вы обнаружите, что первая строка информации в файле test.ua выводится, а комментарий lua добавляется к последней строке файла. Например, вот что я вывожу:
В приведенном выше примере мы использовали метод io. "X", где мы не брали параметры в io.read (), и параметр может быть одним из следующих:
Режим | описание |
---|---|
"*n" | Прочтите число и верните его. Пример: file.read ("* n") |
"*a" | Прочитать весь файл с текущей позиции. Пример: file.read ("* a") |
«* l» (по умолчанию) | Прочтите следующую строку и верните ноль в конце файла (EOF). Пример: file.read ("* l") |
number | Возвращает строку с указанным количеством символов или возвращает ноль, если EOF. Пример: file.read (5) |
Другие методы io:
- io.tmpfile():Возвращает временный дескриптор файла, файл открывается в режиме обновления и автоматически удаляется при завершении программы.
- io.type(file): Проверьте, является ли obj пригодным для использования дескриптором файла
- io.flush(): Записать все данные из буфера в файл
- io.lines(optional file name): Верните итеративную функцию, каждый вызов получит строку содержимого в файле, когда он достигнет конца файла, он вернет ноль, но файл не будет закрыт
Полный режим
Обычно нам нужно обрабатывать несколько файлов одновременно. Нам нужно использовать file: function_name вместо метода io.function_name. В следующем примере показано, как обрабатывать один и тот же файл одновременно:
Выполнив приведенный выше код, вы обнаружите, что первая строка информации в файле test.ua выводится, а комментарий lua добавляется к последней строке файла. Например, вот что я вывожу:
Параметры чтения соответствуют простому режиму.
- "set": начать с начала файла
- "cur": начать с текущей позиции [по умолчанию]
- "конец": начать с конца файла
- смещение: по умолчанию 0
Без параметров file: seek () возвращает текущую позицию, file: seek ("set") указывает на начало файла, file: seek ("end") находит до конца файла и возвращает размер файла.
file:flush(): Записать все данные из буфера в файл
io.lines(optional file name): Откройте указанное имя файла в режиме чтения и верните итеративную функцию. Каждый вызов будет получать строку содержимого в файле. Когда он достигнет конца файла, он вернет nil и автоматически закроет файл.
Если параметр отсутствует, io.lines () <=> io.input (): lines (); считывает содержимое устройства ввода по умолчанию, но не закрывает файл при конец, например
В следующем примере метод seek используется для поиска 25-й позиции снизу файла и используется параметр * a метода чтения для чтения всего файла с текущей позиции (25-я позиция снизу).
согласно документации Lua, file:read("*l") читает следующую строку, пропуская конец строки.
Примечание: - "*l": читает следующую строку, пропуская конец строки, возвращая ноль в конце файла. Это формат по умолчанию
эта документация правильно? Потому что file:read("*l") читает текущую строку, а не следующую строку или мое понимание неверно? Довольно запутанно.
Lua управляет файлами, используя ту же модель базовой реализации C (Эта модель используется также другими языками программирования, и она довольно распространена). Если вы не знакомы с этим способом просмотра файлов, терминология может быть неясной, действительно.
в этой модели файл представлен как поток байт имея так называемый текущая позиция. Текущая позиция является своего рода концептуальным указателем на первый байт в файле, который будет прочитано или написано далее операции ввода-вывода. Когда вы открываете файл для чтения, новый поток настраивается так, чтобы его текущая позиция была началом файла, т. е. текущая позиция "указывает" на первый байт в файле.
В Lua вы управляете потоками через так называемые ручки, которые являются своего рода посредниками для базовых потоков. Любая операция, выполняемая с помощью ручки, переносится на соответствующий поток.
Луа io.open открывает файл, связывает с ним поток C и возвращает дескриптор файла, представляющий этот поток:
поэтому, если вы выполняете любую операцию, которая считывает некоторые байты (обычно интерпретируемые как символы, если вы работаете с текстовыми файлами), они считываются из потока, и для каждого байта читать текущая позиция потока продвигается на один, указывая каждый раз на далее байты читать.
документация Lua подразумевает эту модель. Таким образом, когда он говорит далее строка, это означает, что операция ввода будет считывать все символы в потоке начиная с текущей позиции пока не будет найден символ конца строки.
обратите внимание, что если вы смотрите на текстовые файлы как последовательность строк, вы можете быть введены в заблуждение, так как вы можете думать о "текущей строке" и "следующей строке". Это была бы модель более высокого уровня по сравнению с C модель. Нет" текущей строки " В C. В текстовых файлах C не более чем последовательность байтов, где некоторые специальные символы (символы конца строки) подвергаются некоторой специальной обработке (которая в основном зависит от реализации) и используются некоторыми стандартными функциями C как терминаторы строк, т. е. как метки для обнаружения при остановке чтения символов.
другим источником путаницы для новичков или людей, происходящих из языков более высокого уровня, является то, что в C, для исторической аварии, байты обрабатываются как символы (основной тип данных для обработки один байт char , которое является наименьшим числовым типом в C!). Поэтому для людей с фоном C естественно думать о байтах как о символах и наоборот.
хотя Lua является гораздо более высоким уровнем языка, чем C, его тесная связь с C (он был разработан, чтобы легко взаимодействовать с кодом C) делает его наследовать часть этого подхода c "байты как символы". На самом деле, например, строки Lua могут содержать произвольные байты и могут использоваться для обработки необработанных двоичных данных.
Пример работы с файлами в QLua (Lua): 131 комментарий
Каким способом можно удалить файл?
Удалаяет файл или директорию с заданным именем. Директории должны быть пусты. Если функция
не может провести удаления, она возвращает nil, плюс строку, содержащую описание ошибки.
Удалаяет файл или директорию с заданным именем. Директории должны быть пусты. Если функция
не может провести удаления, она возвращает nil, плюс строку, содержащую описание ошибки.
Здравствуйте. Скажите, есть ли функция, чтобы удостоверится, что файл уже открыт другим процессом ( ботом)? Т.е. хочу в один файл писать из разных роботов и чтобы не было конфликта, что бы робот "ждал" пока другой закончил чтение/запись и закрыл файл. Вроде, это что-то простое должно быть?
Файл открывается у меня для чтения local f = io.open(path, "r+")
Файл открывается у меня для записи local f = io.output(path)
Правда я не проверял, может уже будет "конфликт" и можно его "зафиксировать" и ждать.
только обрабатывая ошибки открытия файла. примерно так:
только нужно помнить, что не всегда ошибки будут возникать, так как для чтения можно открыть его сколько угодно раз. в lua нет способа явно указать, что файл нужно открыть для эксклюзивного доступа, разве что всегда открывать его в режиме записи, и для чтения тоже.
Задача: хотел просто в общий тхт файл кой какую статистику писать. Каждый робот пишет свое, но в один файл. Что бы его открыл и видишь в целом, что в Квике с торговлей происходит. У какого бота какая позиция, соответствует ли она общей позиции в квике и т.д.
посмотрите либу по ссылке, это как раз ваш случай. вы можете написать некий код, который будете вызывать из разных скриптов или даже разных квиков, и при этом у вас не будет проблем с доступом из разных скриптов/приложений.
f = io.open(getScriptPath().."\\Test.txt","r+");
и почему в конце , "r+", что оно делает? И для чего нужна
f = io.open(getScriptPath().."\\Test.txt","r+");
Не могли бы Вы объеснить чуть краче , тоесть , что такое getScriptPath()..""\\
"и почему в конце , "r+", что оно делает? И для чего нужна" - это режим открытия файла r от слова read - чтение, знак + означает что можно еще и писать будет в файл, в итоге "r+" означает режим чтения/записи
"Не могли бы Вы объеснить чуть краче , тоесть , что такое getScriptPath()..""\\" - getScriptPath() это функция встроенная в QLua, которая возвращает полный путь к скрипту, из которого она вызвана, оператор ".." называется оператором конкатенации, т.е. служит для склеивания нескольких строк в одну. В итоге, если Ваш скрипт находится в папке "C:\\Trading", то в результате склейки получится строка "C:\\Trading\\Test.txt", двойной слеш используется для экранирования символа слеш, т.к. есть различные спецсимволы, которые содержат в себе слеш, например, "\n" означает перенос строки, и чтобы в строку добавить именно символ слеш, который компьютер не будет пытаться распознать как начало спецсимвола, нужно экранировать его вторым слешем.
Такой вопрос. Если я "поставил" курсор в нужное место, то я могу как-то "вставлять" или наоборот "затирать"?
Например, есть строка в файле : "Я иду в школу", "ставлю" курсор перед "школу" . Если я в это место впишу "любимую" , то получится: "Я иду в любимую" правильно? Т.е. школа затрется? А можно "вставить" чтобы получилось ". в любимую школу". Или запись в файл как раз наоборот работает - вставляет , а не затирает? Или может даже есть разные способы? Понятно что можно считать весь файл и работать уже с текстом и потом полностью перезаписать. А вот сразу в файл так нельзя писать в разных режимах?
Только перезаписывать поверх можно, вставлять нельзя, файл это область памяти выделенная, к ней можно только добавить в конец еще какой-то объем памяти. Это как строка в тетради написанная, Вы же не сможете внутрь нее еще слов вставить, только перезаписать поверх, или в конец добавить. С файлами так же.
Здравствуйте!
Подскажите а как из файла прочитать данные в переменную.
Спасибо!
День добрый.
как получить значение из последней строки в txt файле?
как получить значение из последний строки предпоследнего столбца в файле csv, или например 3 столбца?
Добрый день!
Данный скрипт
Ошибка lua:6: attempt to index global 'f' (a nil value)
Помогите разобраться!
Видно, что недостаточно базовых знаний по программированию, приглашаю на скайп-обучение 🙂
Читайте также: