Работа с файлами.

Частые вопросы возникающие при работе с ботами. Загляните сюда перед созданием новой темы.

Модератор: Модераторы

Работа с файлами.

Сообщение tvrsh » 11 окт 2008 12:40

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

1. Чтение всех строк из файла в список.
Это одна из самых основных операций при работе с файлами, которая используется в очень многих случаях, ознакомьтесь внимательно с ней!

TCL: [ Скачать ] [ Скрыть ]
# Имя файла который будем читать.
set fname "yourfile.txt"

# Открываем доступ к файлу для чтения (мы не ловим ошибки, однако
# можно использовать catch {} в случае если файл отсутствует.
set fp [open $fname "r"]

# Тут мы считываем все данные из файла.
set data [read -nonewline $fp]

# Закрываем файл.
close $fp

# Теперь разбиваем данные на отдельные строки.
set lines [split $data "\n"]

Теперь у нас в переменной lines все строки из файла, далее смотрим другие операции с файлами.

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

TCL: [ Скачать ] [ Скрыть ]
# Используйте код из примера (1.) для чтения всех строк из файла.
# Мы продолжаем сразу после: set lines [split $data "\n"]

# получаем количество строк в файле.
set numlines [llength $lines]

# Выбираем номер случайной строки используя функцию rand.
set num [rand $numlines]

# Забираем эту строку!
set randline [lindex $lines $num]

Теперь в переменной $randline у нас находится случайная строка. Если вы хотите получить несколько строк запустите последнюю часть года в цикле.

3. Удаление строки из файла.
Вам може понадобиться удалить строку из файла. Запомните что во многих языках, включая TCL номера элементов начинаются с 0. То-есть, чтобы удалить первую строку вам надо удалить строку с индексом 0, чтобы удалить вторую, с индексом 1. И так далее.

TCL: [ Скачать ] [ Скрыть ]
# Используйте код из примера (1.) для чтения всех строк из файла.
# Мы продолжаем сразу после: set lines [split $data "\n"]

# Удаляем первую строку.
set line_to_delete 0

# Если хотите удалить последнюю строку то используйте:
# set line_to_delete [expr {[llength $lines] - 1}]

# Теперь удаляем строку из списка в памяти.
proc K {x y} { set x }
set lines [lreplace [K $lines [set lines {}]] $line_to_delete $line_to_delete]

# И наконец, перезаписываем файл с новыми данными.
set fp [open $fname "w"]
puts $fp [join $lines "\n"]
close $fp
 

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

4. Добавление строки в файл.
Обычно строки добавляют в начало или в конец файла. В примере ниже рассмотрим последний вариант.

TCL: [ Скачать ] [ Скрыть ]
# Используйте код из примера (1.) для чтения всех строк из файла.
# Мы продолжаем сразу после: set lines [split $data "\n"]

# Для добавления в начало используйте индекс строки 0, так как счет начинается с 0.
# Если хотите добавить строку в конец файла смотрите следующий пример.
set line_to_insert "это новая строка"
set where_to_insert end

# Добавляем эту строку с список находящийся в памяти.
set lines [linsert $lines $where_to_insert $line_to_insert]

# И переписываем файл с новыми данными как в примере (3.).
set fp [open $fp "w"]
puts $fp [join $lines "\n"]
close $fp


5. Добавление строки в конец файла.
Для добавления стоки в конец файла не обязательно считывать и перезаписывать файл полностью. Мы будем открывать файл в режиме "append mode".

TCL: [ Скачать ] [ Скрыть ]
# Новая строка.
set line_to_add "это новая строка"

# Файл куда мы будем ее добавлять.
set fname "yourfile.txt"

# Открываем файл в append mode.
set fp [open $fname "a"]

# Добавляем строку.
puts $fp $line_to_add

# Все готово!
close $fp


Вольный перевод поста http://forum.egghelp.org/viewtopic.php?t=6885
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1037
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 2 раз.
Поблагодарили: 83 раз.
Версия бота: Eggdrop 1.6.20+suzi

Вернуться в FAQ + HowTo

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron