Чтение удаленного файла, начинающегося с "smb:/ /" с помощью R

читать файл в R, Я обычно делаю что-то вроде следующего:

read.csv('/Users/myusername/myfilename.csv')

но я пытаюсь прочитать файл, расположенный на удаленном сервере (Windows SMB/CIFS share), к которому я обращаюсь на своем Mac через FinderGoподключение к серверу пункт меню.

когда я это свойства файла, путь к файлу отличается от того, к чему я привык. Вместо того чтобы начать с: /Users/myusername/..., это smb://server.msu.edu/.../myfilename.csv.

пытаясь прочитать файл, я попробовал следующее:

read.csv('smb://server.msu.edu/.../myfilename.csv')

но это не сработало.

вместо "нет такого файла или каталога" ошибки, это возвращается:

smb: / / сервер.МГУ.edu / ... / myfilename.csv не существует в текущем рабочем каталоге

Я полагаю, что путь к файлу нуждается в другом формате, но я не могу понять, что.

как вы можете прочитать этот тип файла в R?

5 ответов


объяснение

smb://educ-srvmedia1.campusad.msu.edu/... на самом деле URL-адрес не путь к файлу.

давайте разберем это

smb:// значит использовать протокол блокировки сообщений сервера (общий доступ к файлам)

educ-srvmedia1.campusad.msu.edu - имя сервера

/.../myfilename.csv - это файловый ресурс / путь на удаленном сервере

вы можете перейти к этому каталогу с помощью Finder на OSX, потому что он имеет встроенную поддержку SMB протокол. Finder подключается к удаленной службе с помощью URL-адреса и позволяет просматривать файлы.

R не имеет понимания протокола SMB, поэтому не может правильно интерпретировать путь к файлу.

на R функции read.csv() использует file() внутренне, см. https://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html

url и поддержка файлов url схемы file://, http://, https: / / и ftp://

таким образом, R возвращает сообщение "не удалось найти файл", потому что файл не может быть найден, потому что протокол не поддерживается. да, немного сбивает с толку.

исправить

нужно подключить общую папку в локальной файловой системе.

все это означает, что детали протокола SMB будут обрабатываться за кулисами ОС, а файловая система будет представлена как локальный каталог.

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

например

# need to create /LocalFolder first
mount -t cifs //username:password@hostname/sharename /LocalFolder

затем в R:

read.csv('/LocalFolder/myfilename.csv')

дополнительно

пользователи Windows могут сделать это проще с UNC пути
как читать файлы из UNC-указанного каталога в R?


ниже я показал способ, который я использовал время от времени для чтения данных с сетевого диска SMB. В приведенном ниже коде я использовал R system функция, чтобы сделать все из R, но вы также можете подключить диск из командной строки OSX или из Finder с помощью Command-K (подключение к серверу):

если у вас его еще нет, создайте каталог на локальном диске, где будет находиться общий ресурс (это не обязательно, так как вы можете смонтировать диск в существующем местоположение):

system("mkdir /Users/eipi10/temp_share/")

или

dir.create("/Users/eipi10/temp_share/")

подключите сетевой диск к только что созданной папке. В приведенном ниже коде //username@domain.address.edu/home/u/eipi10 - это ваше имя пользователя и адрес общего ресурса SMB.

system("mount_smbfs //username@domain.address.edu/home/u/eipi10 /Users/eipi10/temp_share")

если есть аутентификация пароля, то пароль также может быть включен:

system("mount_smbfs //username:password@domain.address.edu/home/u/eipi10 /Users/eipi10/temp_share")

читать данные:

dat = read.csv("/Users/eipi10/temp_share/fileToRead.csv")

из R вы также можете программно выбрать файлы для чтения:

data.list = lapply(list.files(pattern="csv$", "/Users/eipi10/temp_share/", full.names=TRUE), read.csv)

TL; DR

вот портативный подход, который использует cURL и не требует установки удаленных файловых систем:

> install.packages("curl")
> require("curl")
> handle <- new_handle()
> handle_setopt(handle, username = "domain\username")
> handle_setopt(handle, password = "secret") # If needed
> request <- curl_fetch_memory("smb://host.example.com/share/file.txt", handle = handle)
> contents <- rawToChar(request$content)

если нам нужно прочитать содержимое как CSV, как в вопросе, мы можем передать файл через другую функцию:

> stream <- curl("smb://host.example.com/share/file.txt", handle = handle)
> contents <- read.csv(stream)

давайте посмотрим на более надежный способ доступа к удаленным файлам через smb:// URLs помимо подхода, описанного в других ответах, который монтирует удаленный файловая система. К сожалению, я немного опоздал, но надеюсь, что это поможет будущим читателям.

в некоторых случаях у нас могут не быть привилегий, необходимых для монтирования файловой системы (для этого требуется доступ администратора или root во многих системах), или мы просто не можем хочу монтировать всю файловую систему только для чтения одного файла. Мы будем использовать библиотека cURL вместо того, чтобы прочитать файл. Такой подход повышает гибкость и мобильность наших программ, поскольку мы не нужно зависеть от наличия внешней файловой системы. Мы рассмотрим два разных способа: через a system() вызов, и с помощью пакета, который предоставляет curl API.

некоторый фон: для тех, кто не знаком с ним, cURL предоставляет инструменты, используемые для передачи данных по различным протоколам. С версия 7.40, cURL поддерживает протокол SMB/CIFS, обычно используемый для служб общего доступа к файлам Windows. cURL включает инструмент командной строки что мы можем использовать для извлечения содержимого файла:

$ curl -u 'domain\username' 'smb://host.example.com/share/file.txt'

команда выше считывает и выводит (в STDOUT) содержимое .txt с удаленного сервера host.example.com аутентификация в качестве указанного пользователя в домене. При необходимости команда запросит пароль. Мы можем удалить часть домена из имени пользователя, если наша сеть не использует домен.

Системный Вызов

мы можем достичь та же функциональность в R с помощью system() функции:

system("curl -u 'domain\username' 'smb://host.example.com/share/file.txt'")

обратите внимание на двойную обратную косую черту в domain\username. Это избегает символа обратной косой черты, так что R не интерпретирует его как escape-символ в строке. Мы можем захватить содержимое файла из вывода команды в переменную, установив на


SMB-это протокол сетевой папки Windows.

подобные случаи включают в себя sftp:// URLs, например.

вы можете:

  1. смонтируйте папку в вашей операционной системе и получите к ней доступ по обычному пути,
  2. используйте библиотеку виртуальных файловых систем, например GVFS / GIO в Linux. Возможно, вокруг этого есть какая-то R-оболочка, которую вы можете использовать.

на мой взгляд, существует два способа достижения вашей цели.

  • первый-использовать fstab для добавить определенно удаленную папку как локальный диск.

  • второй временное крепление удаленной папки как папка, когда это требуется


ниже я объясню, как может быть реализован второй метод

  • создать локальный каталог :

    mkdir <mountdirectory>

  • подключите удаленный каталог к локальному с помощью этой командной строки:

    sshfs <remoteserverip>:<remotedirpath> <mountdirectory> для SSH

    или (сначала установите cifs util:sudo apt-get install cifs-utils)

    mount -t cifs -o username=<USERNAME>,password=<PASSWD> //<remoteserverip>/<remotedirpath> <mountdirectory> для SMB

  • сделать работу с локальным файлом !

  • в конце используйте эту команду для отключения :

    fusermount -u <mountdirectory>