Php, как правильно открыть файл времени txt как удобочитаемый
Обновлено: 21.11.2024
Вывод: в этом руководстве вы узнаете, как проверить, существует ли файл в PHP, используя функции file_exists() , is_file() , is_readable() и is_writable().
PHP предоставляет несколько полезных функций, позволяющих проверить, существует ли файл. Давайте рассмотрим эти функции и способы их эффективного использования.
Проверка существования файла с помощью функции file_exists()
Чтобы проверить, существует ли файл, используйте функцию file_exist():
Функция file_exists() принимает имя файла и возвращает значение true, если файл существует; в противном случае возвращается false .
В следующем примере функция file_exists() используется для проверки существования файла readme.txt в текущем каталоге:
Если файл readme.txt существует в том же каталоге, что и скрипт, вы увидите следующее сообщение:
…иначе вы увидите другое сообщение:
Обратите внимание, что $filename также может быть путем к каталогу. В этом случае функция file_exists() возвращает значение true, если каталог существует.
Проверка существования файла с помощью функции is_file()
Если вы хотите проверить, является ли путь файлом (не каталогом) и существует ли он в файловой системе, вы можете использовать функцию is_file().
Функция is_file() принимает $filename и возвращает true, если $filename является файлом и существует:
В следующем примере функция is_file() используется для проверки существования файла readme.txt:
Проверить, существует ли файл и доступен ли он для чтения
На практике часто требуется проверить, существует ли файл, прежде чем читать его содержимое. Чтобы проверить, существует ли файл и доступен ли он для чтения, вы используете функцию is_readable():
Функция is_readable() возвращает значение true, если файл $filename существует и доступен для чтения, или значение false в противном случае. Обратите внимание, что $filename может быть каталогом.
В следующем примере используется функция is_readable(), чтобы проверить, существует ли файл readme.txt и доступен ли он для чтения:
Проверить, существует ли файл и доступен ли он для записи
Перед записью в файл необходимо убедиться, что файл существует и доступен для записи. В этом случае вы можете использовать функцию is_writable():
Функция is_writable() возвращает true, если $filename существует и доступен для записи, или false в противном случае.
fopen() привязывает именованный ресурс, заданный именем файла, к потоку.
Параметры
Если имя файла имеет форму "scheme://. ", предполагается, что это URL-адрес, и PHP будет искать обработчик протокола (также известный как оболочка) для этой схемы. Если для этого протокола не зарегистрированы оболочки, PHP выдаст уведомление, чтобы помочь вам отследить потенциальные проблемы в сценарии, а затем продолжит работу, как если бы имя файла указывает на обычный файл.
Если PHP решил, что имя файла указывает на локальный файл, он попытается открыть поток для этого файла. Файл должен быть доступен для PHP, поэтому вам необходимо убедиться, что права доступа к файлу разрешают этот доступ. Если вы включили open_basedir, могут применяться дополнительные ограничения.
Если PHP решил, что имя файла указывает зарегистрированный протокол, и этот протокол зарегистрирован как сетевой URL, PHP проверит, включен ли параметр allow_url_fopen. Если он выключен, PHP выдаст предупреждение и вызов fopen завершится ошибкой.
На платформе Windows будьте осторожны, избегайте обратной косой черты, используемой в пути к файлу, или используйте прямую косую черту.
Параметр режима указывает тип доступа, который вам требуется к потоку. Это может быть любое из следующего:
mode | Description |
---|---|
'r' | Открыть только для чтения; поместите указатель файла в начало файла. |
'r+' | Открыть для чтения и записи; поместите указатель файла в начало файла. |
'w' | Открыть только для записи; поместите указатель файла в начало файла и обрежьте файл до нулевой длины. Если файл не существует, попытайтесь его создать. |
'w+' | Открыть для чтения и записи; в противном случае он имеет то же поведение, что и 'w' . |
'a' | Открыть только для записи; поместите указатель файла в конец файла. Если файл не существует, попытайтесь его создать. В этом режиме fseek() не действует, записи всегда добавляются. |
'a+' | Открыть для чтения и записи; поместите указатель файла в конец файла. Если файл не существует, попытайтесь его создать. В этом режиме fseek() влияет только на позицию чтения, записи всегда добавляются. |
'x' | Создать и открыть только для записи; поместите указатель файла в начало файла. Если файл уже существует, вызов fopen() потерпит неудачу, вернув false и сгенерировав ошибку уровня E_WARNING. Если файл не существует, попытайтесь его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для базового системного вызова open(2). |
'x+' | Создать и открыть для чтения и записи; в противном случае он имеет то же поведение, что и 'x' . |
'c' | Открыть файл только для записи. Если файл не существует, он создается. Если он существует, он не усекается (в отличие от 'w'), и вызов этой функции не завершается ошибкой (как в случае с 'x'). Указатель файла располагается в начале файла. Это может быть полезно, если желательно получить рекомендательную блокировку (см. flock() ) перед попыткой изменить файл, так как использование 'w' может обрезать файл до того, как будет получена блокировка (если требуется усечение, ftruncate() может быть используется после запроса блокировки). |
'c+' | Открыть файл для чтения и записи; в противном случае он имеет то же поведение, что и 'c' . |
'e' | Установить флаг закрытия при выполнении в дескрипторе открытого файла. Доступно только в PHP, скомпилированном в системах, соответствующих стандарту POSIX.1-2008. |
Примечание.
Разные семейства операционных систем имеют разные правила окончания строки. Когда вы пишете текстовый файл и хотите вставить разрыв строки, вам нужно использовать правильные символы конца строки для вашей операционной системы. Системы на базе Unix используют \n в качестве символа конца строки, системы на базе Windows используют \r\n в качестве символов окончания строки, а системы на базе Macintosh (Mac OS Classic) используют \r в качестве символа окончания строки.
Если вы используете неправильные символы окончания строки при написании файлов, вы можете обнаружить, что другие приложения, открывающие эти файлы, будут «выглядеть забавно».
Windows предлагает флаг перевода текстового режима ( 't' ), который будет прозрачно переводить \n в \r\n при работе с файлом. Напротив, вы также можете использовать 'b' для принудительного двоичного режима, который не будет преобразовывать ваши данные. Чтобы использовать эти флаги, укажите «b» или «t» в качестве последнего символа параметра режима.
Режим перевода по умолчанию — «b». Вы можете использовать режим 't', если вы работаете с текстовыми файлами и используете \n для разделения окончаний строк в своем скрипте, но ожидайте, что ваши файлы будут доступны для чтения в таких приложениях, как старые версии блокнота. Вы должны использовать 'b' во всех остальных случаях.
Если вы укажете флаг 't' при работе с двоичными файлами, у вас могут возникнуть странные проблемы с вашими данными, включая поврежденные файлы изображений и странные проблемы с \r\n символов.
Примечание:
Для обеспечения переносимости также настоятельно рекомендуется переписать код, использующий или зависящий от режима 't', чтобы вместо него использовались правильные окончания строк и режим 'b'.
Примечание. Этот режим игнорируется для обработчиков потоков php://output, php://input, php://stdin, php://stdout, php://stderr и php://fd. .
Необязательный третий параметр use_include_path может иметь значение 1 или true, если вы хотите искать файл и в include_path.
(PHP 4, PHP 5, PHP 7, PHP 8)
file — считывает весь файл в массив
Описание
Считывает весь файл в массив.
Примечание.
Вы можете использовать file_get_contents() для возврата содержимого файла в виде строки.
Параметры
Путь к файлу.
URL-адрес можно использовать в качестве имени файла с этой функцией, если включена оболочка fopen. См. fopen() для более подробной информации о том, как указать имя файла. См. Поддерживаемые протоколы и оболочки для получения ссылок на информацию о возможностях различных оболочек, заметок об их использовании и информации о любых предопределенных переменных, которые они могут предоставлять.
Необязательные флаги параметров могут быть одной или несколькими из следующих констант: FILE_USE_INCLUDE_PATH Поиск файла в include_path. FILE_IGNORE_NEW_LINES Пропускать новую строку в конце каждого элемента массива FILE_SKIP_EMPTY_LINES Пропускать пустые строки
Возвращаемые значения
Возвращает файл в виде массива. Каждый элемент массива соответствует строке в файле с прикрепленным символом новой строки. При ошибке file() возвращает false .
Примечание.
Каждая строка результирующего массива будет включать окончание строки, если только не используется FILE_IGNORE_NEW_LINES.
Примечание. Если PHP неправильно распознает окончания строк при чтении файлов на компьютере Macintosh или созданных им, включение параметра конфигурации во время выполнения auto_detect_line_endings может помочь решить проблему.
Ошибки/Исключения
Выдает ошибку уровня E_WARNING, если файл не существует.
Примеры
// Используя необязательный параметр флагов
$trimmed = file ('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
?>
Примечания
См. также
- file_get_contents() — считывает весь файл в строку
- readfile() — выводит файл
- fopen() — открывает файл или URL-адрес
- fsockopen() – открыть подключение к Интернету или доменному сокету Unix.
- popen() — открывает указатель файла процесса
- включить – включить
- stream_context_create() — создает контекст потока.
Примечания, внесенные пользователями 15 примечаний
Если файл, который вы читаете, имеет формат CSV, не используйте file(), используйте fgetcsv(). file() будет разделять файл по каждой новой строке, которую он найдет, даже новой строке, которая появляется в поле (т.е. в кавычках).
это может быть очевидным, но мне потребовалось некоторое время, чтобы понять, что я делаю неправильно. Поэтому я хотел поделиться. У меня есть файл на моем диске "c:\". Как мне файл() это?
Не забывайте, что обратная косая черта является специальной, и вы должны «экранировать» обратную косую черту, т. е. «\\»:
= файл ("C:\\Documents and Settings\\myfile.txt");
foreach($lines as $line)
echo( $line);
>
надеюсь, это поможет.
Чтобы записать все строки файла, другими словами, прочитать файл построчно, вы можете написать такой код:
= file ( 'name.txt' );
// Чтобы проверить количество строк
echo count ( $names ). '
' ;
foreach( $names as $name )
echo $name . '
' ;
>
?>
этот пример настолько прост, что можно понять, как он работает. Надеюсь, это поможет многим новичкам.
читать из CSV-данных (файла) в массив с именованными ключами
<р>. с или без 1-й строки = заголовок (ключи)(см. 4-й параметр вызова функции как true/false)
функция csv_in_array ($url, $delm = ";", $encl = "\"", $head = false)
$csvxrow = файл ( $url ); // ---- строки csv в массив ----
$csvxrow [ 0 ] = отбивная ( $ csvxrow [ 0 ]);
$csvxrow [0] = str_replace ($encl, '', $csvxrow [0]);
$keydata = взорвать ( $delm , $csvxrow [ 0 ]);
$keynumb = количество ($keydata);
if ($head === true) <
$anzdata = count ($csvxrow);
$z = 0 ;
for( $x = 1 ; $x $anzdata ; $x ++) <
$csvxrow [ $x ] = Chop ( $csvxrow [ $x ]);
$csvxrow [$x] = str_replace ($encl, '', $csvxrow [$x]);
$csv_data [$x] = взорвать ($delm, $csvxrow [$x]);
$i = 0 ;
foreach( $keydata as $key ) <
$out [ $z ][ $key ] = $csv_data [ $x ][ $i ];
$i++;
>
$z++;
>
>
else <
$i = 0 ;
foreach( $csvxrow as $item ) <
$item = отбивная ( $item );
$item = str_replace ($encl, '', $item);
$csv_data = взорвать ($delm, $item);
for ( $y = 0 ; $y $keynumb ; $y ++) <
$out [ $i ][ $y ] = $csv_data [ $y ];
>
$i++;
>
>
?>
вызов функции с 4 параметрами:
(1) = файл с данными CSV (url / строка)
(2) = разделитель столбцов (например: ; или | или , . )
(3) = значения, заключенные в (например, : ' или " или ^ или . )
(4) = с 1-й строкой или без нее = голова (истина/ложь)
Имейте в виду, что использование file() для подсчета строк может привести к OOM на сервере, поскольку все строки будут размещены в массиве.
Если вы имеете дело с файлами, которые могут содержать тысячи строк, лучше использовать SplFileObject, и с небольшими изменениями вы можете получить тот же результат.
Начиная с PHP 5.6 функции file(), file_get_contents() и fopen() будут возвращать значение false, если вы ссылаетесь на исходный URL-адрес, не имеющий действительного SSL-сертификата. Предположительно, вы будете часто сталкиваться с этим в своих средах разработки, это сведет вас с ума.
Вам нужно будет создать контекст потока и указать его в качестве аргумента для различных операций с файлами, чтобы он игнорировал недействительные учетные данные SSL.
$args = array("ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false),"http"=>array('timeout' => 60, 'user_agent' => ' Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/3.0.0.1'));
(«Проблема file() с UTF-16» неверна. Это обновлено.
Первый может пропустить последнюю строку строки.)
file(), похоже, имеет проблемы с обработкой
UTF-16 с BOM или без него.
file() скорее всего будет считать "\n"=LF (0A) окончанием строки.
Таким образом, не только "000A", но и "010A, 020A. FE0A, FF0A."
рассматриваются как окончание строки.
Более того, file() вызывает серьезную проблему в UTF-16LE.
file() теряет первый "0A" (первую половину "0A00")!
А следующая строка начинается с " 00" (остальная часть "0A00").
Поэтому строки после первого "0A" совершенно разные.
Чтобы избежать этого явления,
например. в случае (php_script: UTF-8, файл: UTF-16 с окончанием строки "\r\n"),
('UTF-16'); // для правильной работы mb_ereg_..()
$str = file_get_contents ( $file_path );
$to_encoding = 'UTF-16' ; // кодировка строки
$from_encoding = 'UTF-8' ; // кодировка PHP_script
$pattern1 = mb_convert_encoding ('[^\r]*\r\n', $to_encoding, $from_encoding);
mb_ereg_search_init ( $str , $pattern1 );
в то время как ( $res = mb_ereg_search_regs ()) $file [] = $res [ 0 ];
>
$pattern2 = mb_convert_encoding ( '\А.*\r\n(.*)\z', $to_encoding, $from_encoding);
mb_ereg ($pattern2, $str, $match);
$file[] = $match[1];
?>
вместо
$file = file($file_path);
Если конец строки равен "\n",
$pattern1 = mb_convert_encoding('[^\n]*\n', $to_encoding, $from_encoding);
Использования if ( file(name.txt) ) может быть недостаточно для проверки того, был ли файл успешно открыт для чтения, потому что файл может быть пустым, и в этом случае возвращаемый массив будет пустым, поэтому вместо этого проверьте с помощью !==. например:
$file_array = файл('test.txt'); // пустой файл
Вот мой конвертер CSV
поддерживает заголовки и обрезает все поля
Примечание: заголовки не должны быть пустыми!
функция csv2array ($file, $delim = ';', $encl = '"', $header = false)
Пользователь предложил всегда использовать rtrim из-за конфликта окончания строки с файлами, у которых EOL отличается от EOL сервера.
Использование rtrim с заменой символов по умолчанию является плохим решением, поскольку оно удаляет все пробелы в дополнение к символам '\r' и '\n'.
Хорошее решение с использованием rtrim:
= rtrim ( $line , "\r\n" ) . PHP_EOL;
?>
Это удаляет только символы EOL и заменяет их символом EOL сервера, что позволяет preg_* нормально работать при сопоставлении EOL ($)
Примечание. Теперь, когда file() является двоично-безопасным, он "намного" медленнее, чем раньше. Если вы планируете читать большие файлы, возможно, стоит использовать fgets() вместо file(). Например:
= fopen("log_file.txt", "r");
while (! feof ( $fd ))
<
$buffer = fgets ( $fd , 4096 );
$lines [] = $buffer ;
>
fclose ( $fd );
?>
Результирующий массив $lines.
Я проверил файл из 200 000 строк. Для fgets() это заняло секунды, а для file() — минуты.
Это примечание относится к PHP 5.1.6 под Windows (хотя может относиться и к другим версиям).
Похоже, что флаг FILE_IGNORE_NEW_LINES не удаляет новые строки должным образом при чтении текстовых файлов в стиле Windows, т. е. файлов, строки которых заканчиваются на '\r\n'.
Решение. Всегда используйте rtrim() вместо FILE_IGNORE_NEW_LINES.
Использование file() для чтения больших текстовых файлов размером > 10 МБ создает проблемы, поэтому вам следует использовать его вместо этого. Это намного медленнее, но работает нормально. $lines вернет массив со всеми строками.
= @ fopen('yourfile.', "r");
if ($handle) <
while (! feof ($handle)) <
$lines [] = fgets ($handle, 4096);
>
fclose ($handle);
>
?>
У меня есть текстовый файл с этой информацией на моем сервере:
Как прочитать всю информацию из текстового файла (построчно) с помощью PHP?
12 ответов 12
$array = взорвать("\n", file_get_contents($filename));
На самом деле это не будет читать его построчно, но вы получите массив, который можно использовать построчно. Есть несколько альтернатив.
Вы также можете создать массив, используя файл:
В этом коде полное содержимое файла копируется в переменную $content, а затем разбивается на массив с каждым символом новой строки в файле.
Что говорит W3Schools:
fopen открывает файл (в данном случае test.txt с режимом 'r', что означает только для чтения и помещает указатель в начало файла)
Цикл while проверяет, находится ли он в конце файла (feof), и, если это не так, вызывает fgets, который получает текущую строку, в которой находится указатель.
Продолжает делать это до конца файла, а затем закрывает файл.
Попробуйте следующее:
Вы можете прочитать группу txt-файлов в папке и отобразить содержимое следующим образом.
Хотя этот код может решить проблему, включение объяснения того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применимы.
<р>. Комментарий Дэвида особенно важен, если вопрос уже содержит много ответов. Можно добавить новый, если он содержит новую информациюПожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение того, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением, как правило, более полезны и качественны, а также с большей вероятностью получат поддержку
Приведенный выше код из Payload отлично работает. Я хотел бы добавить кое-что к этому, потому что другие могут столкнуться с той же проблемой. Я использовал ваш код и пытался сравнить значение со строкой $, полученной из файла .txt. Хотя я знаю, что мое ключевое слово соответствует строке, я все равно получаю сообщение об ошибке. это пример кода.
Проблема в том, что каждая $line содержит новую строку в конце. Но в моем случае я просто использовал ввод для новой строки при создании файла .txt, он не указан чем-то вроде «\n» или idk «\r\n». В любом случае, если вы столкнулись с той же проблемой, обязательно обрежьте () строку $, прежде чем работать с ней, чтобы избавиться от любых пробелов или, в данном случае, от новой строки, иначе вы можете продолжать сталкиваться с ошибками. самый короткий и простой способ сделать это без странных результатов — просто обрезать его прямо в операторе while, как здесь.
и да, я получил некоторые странные результаты, пытаясь бросить trim() вокруг $line внутри функции substr_compare(), даже несмотря на то, что результат оператора if был TRUE, значение $ имело бы результат " ключевое слово " с пробелом в начале и в конце ключевого слова. странные вещи.
Читайте также: