Почему функция list.files() возвращает файлы, которые невозможно найти?

Я пытаюсь использовать базовую функцию R list.files() для возврата списка имен файлов (файлов .txt), чтобы я мог импортировать их автоматически вместо того, чтобы писать read.table() строку для каждого файла.

Вот проблема, с которой я столкнулся:

Используя функцию list.files(), я получаю следующий результат:

> list.files(pattern = "\\.txt$")
[1] "~$ DD - maskedfiletitle.txt"                   
[2] "~$ KP - maskedfiletitle.txt"
[3] "TF DD - maskedfiletitle.txt"                   
[4] "TL XF - maskedfiletitle.txt"                             
[5] "UR FG - maskedfiletitle.txt"                         
[6] "VB PD - maskedfiletitle.txt"                
[7] "VS KP - maskedfiletitle.txt"

Желаемый результат следующий:

[1] "TF DD - maskedfiletitle.txt"                   
[2] "TL XF - maskedfiletitle.txt"                             
[3] "UR FG - maskedfiletitle.txt"                         
[4] "VB PD - maskedfiletitle.txt"                
[5] "VS KP - maskedfiletitle.txt"

Кажется, он всегда возвращает первый и последний файл в папке, в котором первые два символа заменены на «~$». Очевидно, что если следующим шагом будет чтение этих файлов, появится сообщение об ошибке о том, что файл «~$» не существует.

На данный момент я обошёл эту проблему, просто удалив первые два элемента. Однако у меня нет ответа, почему происходит такое поведение.

Я попытался удалить из папки все файлы, отличные от .txt, и переписать функцию для использования других аргументов:

> list.files(all.files = FALSE, no.. = TRUE)
[1] "~$ DD - maskedfiletitle.txt"                   
[2] "~$ KP - maskedfiletitle.txt"
[3] "TF DD - maskedfiletitle.txt"                   
[4] "TL XF - maskedfiletitle.txt"                             
[5] "UR FG - maskedfiletitle.txt"                         
[6] "VB PD - maskedfiletitle.txt"                
[7] "VS KP - maskedfiletitle.txt"

Однако это также дает мне первый и последний файл, в котором первые два символа изменены на «~$».

Это не критическая ошибка или что-то в этом роде, но мне интересно узнать, откуда такое поведение. Я прочитал раздел справки по этой функции и немного поискал в Интернете, но не нашел ничего, что объясняло бы это, и я в полном замешательстве.

Дайте мне знать, если мне нужно предоставить дополнительную информацию!

Обычно любой файл, начинающийся с ~$, является временным. Открыты ли какие-либо из ваших файлов .txt в настоящее время? Попробуйте сначала закрыть их. Вы также можете указать регулярное выражение в аргументе pattern, чтобы исключить файлы, начинающиеся с ~$.

nrennie 11.06.2024 09:58

@nrennie, пожалуйста, опубликуйте ответ с шаблоном регулярного выражения.

zx8754 11.06.2024 10:41

@nrennie: это хорошее предположение. Стоит отметить, что префикс ~$ — это всего лишь соглашение, используемое некоторым программным обеспечением; другие редакторы используют другие префиксы. Например, я вижу .~lock. в качестве префикса файлов, открытых в Libreoffice.

user2554330 11.06.2024 10:44

Вы действительно получаете сообщение об ошибке, в котором говорится, что файлы не существуют? Я почти уверен, что list.files не врет, они действительно есть, просто, вероятно, не содержат того, что вы хотите.

MrFlick 11.06.2024 16:20

@nrennie прав, я не знал, что именно так возвращаются открытые файлы. Из-за процесса преобразования за пределами Rstudio (при котором первый и последний файлы остаются открытыми) я ошибочно пришел к выводу, что это ошибочное поведение list.files

AngryBeaker 12.06.2024 13:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот как использовать list.files(), чтобы выбрать только текстовые файлы в текущем рабочем каталоге:

txt_files <- list.files(pattern = "*.txt")

my_files <- lapply(txt_files,readLines)

# assign files to variables
TF_DD <- my_files[[1]]
TL_XF <- my_files[[2]]
UR_FG <- my_files[[3]]
VB_PD <- my_files[[4]]
VS_KP <- my_files[[5]]

Я надеюсь, что это помогает!

Обратите внимание, что pattern= вместо list.files — это регулярное выражение, а не файловый глобус. Технически это также соответствует файлу с именем atxt.pdf.

MrFlick 11.06.2024 16:19

~$ используется для префикса скрытых временных файлов, которые создаются при открытии документа в Windows. Вы можете отфильтровать их, определив шаблон с помощью регулярных выражений в R. Например:

filtered_files <- files[!grepl("^~\\$", files)]

Он сохраняет файлы, которые не начинаются с ~$.

Ответ принят как подходящий

Обычно любой файл, начинающийся с ~$, является временным (по крайней мере, в Windows). Если какой-либо из ваших файлов .txt в настоящее время открыт, попробуйте сначала закрыть его.

В противном случае я подумал, что вы могли бы объединить файлы, которые заканчиваются на .txt, и файлы, которые не начинаются с условий ~$, в одно регулярное выражение для использования в аргументе pattern (используя "^(?!~\\$).*\\.txt$"). Однако аргумент pattern в list.files не поддерживает напрямую отрицательный просмотр вперед, поэтому вам нужно сделать это в два этапа:

  • найдите все файлы, которые заканчиваются на .txt (как вы уже это сделали)
  • затем отфильтруйте, чтобы исключить те, которые начинаются с ~$
my_files <- list.files(pattern = "\\.txt$")
txt_files <- my_files[!grepl("^~\\$", my_files)]

Один комментарий: если некоторые ваши файлы открыты в редакторе, неясно, хотите ли вы вообще продолжать. Возможно, стоит сразу прервать процесс, на случай, если в версии на диске отсутствуют некоторые обновления, имеющиеся в копии редактора.

user2554330 11.06.2024 15:30

Выбрал это в качестве ответа на вопрос, поскольку @nrennie первым упомянул, что ~$ добавляется во временные файлы. Если бы вы могли добавить в начало ответа одно предложение о том, что вам следует закрыть все файлы, которые вы хотите вернуть, с помощью list.files, тогда ответ был бы идеальным. Для моего личного рабочего процесса я очень ценю наличие дополнительной строки регулярного выражения.

AngryBeaker 12.06.2024 13:44

Другие вопросы по теме