无法判断samba共享上的文件是否存在
我知道文件名是 file001.txt
或者 FILE001.TXT
,但我不确定具体是哪一个。这个文件在一台我通过samba挂载点访问的Windows机器上。
在 os.path
里的一些函数好像不区分大小写,但 open
函数却是区分大小写的:
>>> from os.path import exists, isfile
>>> exists('FILE001.TXT')
True
>>> isfile('FILE001.TXT')
True
>>> open('FILE001.TXT')
Traceback (most recent call last):
File "<console>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'FILE001.TXT'
>>> open('file001.txt') # no problem
所以,我有以下几个问题:
有没有办法在不打开文件(或者不列出它所在目录)的情况下确定文件名?
为什么
open
函数要区分大小写,而os.path
不区分?
更新:感谢大家的回答,但 这不是一个Python的问题,所以我决定关闭这个问题。
3 个回答
0
def exists(path):
try:
open(path).close()
except IOError:
return False
return True
除了权限问题,你为什么不想打开这个文件呢?
0
来回答你的问题:
- 你可以使用
stat
这个工具来检查一个文件是否存在,而不需要去打开它。 - Windows系统的共享文件夹对大小写不敏感,也就是说“文件.txt”和“FILE.txt”被认为是同一个文件。
1
你可以试着在你的 fstab 文件中给挂载添加 nocase,就像我下面找到的这个例子一样,如果它还没有的话:
//server/acme/app /home/joe/.wine/drive_c/App cifs guest,rw,iocharset=utf8,nocase,file_mode=0777,dir_mode=0777 0 0
normcase 是一个很实用的小功能,它可以处理那些对文件名大小写不敏感的操作系统,比如说它会把 mahadeva.mp3 和 mahadeva.MP3 认为是同一个文件。例如,在 Windows 和 Mac OS 上,normcase 会把整个文件名转换成小写;而在 UNIX 兼容的系统上,它会保持文件名不变。
这告诉你,在 Windows 文件系统上,open 函数可能总是期待小写的文件名。
所以,os.path 不区分大小写的原因可能是它在检查文件之前调用了 os.path.normcase,而 open 函数没有这样做。不过,这也可能只是个 bug。