Python无法打开我的simlinked文件。我确保文件存在,我可以访问它。我的印象是,在操作系统级别上解析了符号链接,因此Python永远不会知道它。
therold@therold:~/Programming/ML/deeptank/dataset/inc (master)$ ls -lisa /Users/therold/Programming/ML/deeptank/dataset/inc/training/tanks/matilda-iv_689.png
7870541 8 lrwxr-xr-x 1 therold staff 46 13 Mai 16:44 /Users/therold/Programming/ML/deeptank/dataset/inc/training/tanks/matilda-iv_689.png -> ../training_data/matilda-iv/matilda-iv_689.png
OSX显然能够解析符号链接的图像文件。但是Python open()
方法让我失望:
therold@therold:~/Programming/ML/deeptank/dataset/inc (master)$ python
Python 2.7.10 (default, Sep 23 2015, 04:34:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)] on darwin
>>> open("/Users/therold/Programming/ML/deeptank/dataset/inc/training/tanks/matilda-iv_689.png")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: '/Users/therold/Programming/ML/deeptank/dataset/inc/training/tanks/matilda-iv_689.png'
>>>
任何想法我做错了什么?非常感谢帮助。
答案 0 :(得分:8)
任何想法我做错了什么?
符号链接的目标不存在。
我不明白为什么我能在我的问题的ls声明中解决它。
你不是。
默认情况下,ls
命令在链接本身上运行,而不是在链接的目标上运行。如果没有-L
选项,则ls
永远不会尝试解析符号链接。
考虑一个包含这两个文件的目录:
$ ls -l
-rw-rw-r-- 1 me me 6 May 13 11:58 a
lrwxrwxrwx 1 me me 3 May 13 12:00 b -> ./a
a
是一个包含六个字节'hello\n'
的文本文件。 b
是一个链接文件,其中包含目标路径的三个字节:'./a'
。 ls
能够描述链接的属性,而无需取消引用链接本身。
相反,请使用-L
选项:
$ ls -lL
-rw-rw-r-- 1 me me 6 May 13 11:58 a
-rw-rw-r-- 1 me me 6 May 13 11:58 b
现在ls
已解析b
中的链接,并显示有关链接到文件的信息。 -L
ls
现在声称b
也是一个六字节的文本文件。
最后,考虑一下:
$ rm a
$ ls -l
lrwxrwxrwx 1 me me 3 May 13 12:00 b -> ./a
$ ls -lL
ls: cannot access b: No such file or directory
l????????? ? ? ? ? ? b
现在b
是一个解析为不再存在的文件的链接。由于ls -l
从不尝试解析链接,因此其输出与先前的测试相同。 (b
是一个链接文件,长度为3个字节,内容为'./a'
。)
但是ls -lL
尝试解析链接,失败并显示失败信息。
答案 1 :(得分:1)
我正在记录答案,因为我遇到了同样的问题,但是我的符号链接 did 的目标存在。
尝试通过熊猫中的符号链接打开文件时,显示了一条无用的未找到消息:
⇒ ipython.exe # this is a clue to the answer below...
In [1]: import pandas as pd
In [2]: codes = pd.read_excel('codes-no-agg-children.xlsx', ...)
---------------------------------------------------------------------------
<...lots of traceback stuff...>
FileNotFoundError: [Errno 2] No such file or directory: 'codes-no-agg-children.xlsx'
由于目标确实存在,所以上面的答案对我没有帮助,但是这个问题促使我尝试打开常规的python而不是通过pandas:
In [3]: import os
In [4]: os.system('cp ./nvivo-win/good-extracts/codes-no-agg-children.xlsx .')
\\wsl$\Ubuntu\home\sigfried\ccvs\analysis'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to windows directory.
cp: cannot stat './nvivo-win/good-extracts/codes-no-agg-children.xlsx': No such file or directory
我不知道这意味着什么,但我认为原因是:
用于Windows的Python不能遵循Ubuntu(WSL 2)符号链接(或者,至少它不能将Ubuntu符号链接打开回到Windows文件。
当然,这引起了一个问题,为什么我要从Ubuntu运行Windows python来处理Windows文件-但这在stack-psychoanalysis-for-self-sabotaging-programmers
上更合适。
答案 2 :(得分:1)
我有同样的问题——Fedora 32 系统,Jupyter 的 Notebook 文件夹包含我的文件,其中包含指向 json 文件的符号链接。我用头撞在众所周知的墙上几天,谷歌搜索失败了。 最后,复制文件解决了这个问题(尽管还有其他选项,如硬链接)。
答案 3 :(得分:1)
我今天遇到了类似的问题:当符号链接到文件,并将行读入数组时,一些数字字符串会被分解成单独的列表元素??
直接(而不是通过符号链接)打开原始文件时,此行为消失:
Original file -> Python list
123456 -> '1', '23', '456', ''
123456789 -> '1234567', '89'
十六进制编辑器必须正确遵循符号链接
$ head rockyou.txt | xxd
00000000: 3132 3334 3536 0a31 3233 3435 0a31 3233 123456.12345.123
00000010: 3435 3637 3839 0a70 6173 7377 6f72 640a 456789.password.
00000020: 696c 6f76 6579 6f75 0a70 7269 6e63 6573 iloveyou.princes
00000030: 730a 3132 3334 3536 370a 726f 636b 796f s.1234567.rockyo
00000040: 750a 3132 3334 3536 3738 0a61 6263 3132 u.12345678.abc12
00000050: 330a 3.
$ head rockyou.txt.short | xxd
00000000: 3132 3334 3536 0a31 3233 3435 0a31 3233 123456.12345.123
00000010: 3435 3637 3839 0a70 6173 7377 6f72 640a 456789.password.
00000020: 696c 6f76 6579 6f75 0a70 7269 6e63 6573 iloveyou.princes
00000030: 730a 3132 3334 3536 370a 726f 636b 796f s.1234567.rockyo
00000040: 750a 3132 3334 3536 3738 0a61 6263 3132 u.12345678.abc12
00000050: 330a 3.
$ ls -lah rock*
lrwxr-xr-x 1 u g 17B Apr 16 10:56 rockyou.txt -> rockyou.txt.short
-rw-r--r-- 1 u g 945B Apr 16 11:39 rockyou.txt.short
MacOS Catalina,Python 3.7、3.8
答案 4 :(得分:0)
...不要忘记使用完整路径。在使用Python 3.7.3的Raspberry Pi上,我必须包括一个有效链接的整个路径:
os.symlink("Desktop/a.txt","Desktop/a_link.txt") # WRONG !
python3无法识别文件a.txt,因为标准外壳程序的路径未激活。
os.symllink("/home/pi/Desktop/a.txt","/home/pi/Desktop/a_link.txt")
效果很好。