Единственная проблема, которую я вижу, когда читаю по трассировке стека, состоит в том, что символы Юникода неправильны (их там нет), учитывая TSV образца OP:
FileNotFoundError: [Errno 2] No such file or directory: '"./Personal Research/Ramnad 9""14""10"/DSC_0003.NEF' -> './duplicateRoot/Personal Research/Ramnad 9""14""10"/DSC_0003.NEF'
В исходные и конечные пути, которых, как мне кажется, быть не должно, дополнительные и двойные двойные кавычки, похоже, что путь был разбит и снова соединен (или что-то в этом роде):
'"./Personal Research/Ramnad 9""14""10"/DSC_0003.NEF'
Я попытался воссоздать ошибку OP, но не смог. Но когда я работал над примером ниже, я первоначально получил FileNotFoundError
(потому что мне не хватало папок назначения, следовательно, os.makedirs()
в моем примере), но путь был правильно закодирован:
FileNotFoundError: [Errno 2] No such file or directory: 'foo/Personal Research/Ramnad 9\uf01914\uf01910/DSC_0006.JPG'
Все, что я могу предложить, это предположение, что кодировка испорчена либо в файле TSV, либо в entrydict
. OP, вы проверяли этот файл или диктовку в интерпретаторе и проверяли, видите ли вы \uf019
в путях, где вы ожидаете? Может быть что-то вроде следующего, чтобы убедиться, что эти кодовые точки присутствуют:
>>> print(path.encode('unicode_escape'))
b'./Personal Research/Ramnad 9\\uf01914\\uf01910'
>>> # or, look for 61465
>>> [ord(char) for char in path]
[46, 47, 80, 101, 114, 115, 111, 110, 97, 108, 32, 82, 101,
115, 101, 97, 114, 99, 104, 47, 82, 97, 109, 110, 97, 100,
32, 57, 61465, 49, 52, 61465, 49, 48]
Вот моя попытка, это может помочь ...
Я создал образец файла TSV и соответствующую структуру каталогов :
>>> p='./Personal Research/Ramnad 9\uf01914\uf01910'
>>> os.makedirs(p)
>>> checksums=[[p, 'DSC_0006.JPG', 'hash']]
>>> with open('full.tsv', 'a') as fout:
writer = csv.writer(fout, delimiter='\t', quotechar='\"', quoting=csv.QUOTE_MINIMAL)
writer.writerows(checksums)
и коснулся файла в оболочке:
$ touch Personal\ Research/Ramnad\ 91410/DSC_0006.JPG
Проверено full.tsv
, чтобы убедиться, что оно было правильно записано:
$cat full.tsv
./Personal Research/Ramnad 91410 DSC_0006.JPG hash
Пустые блоки - это кодированная точка в кодировке utf-8, основанная на описании Unicode для "
, включенного в OP.
Ran hexdump -C full.tsv
для обеспечения кодирования utf-8 (ищите 2 набора ef 80 99
):
00000010 72 63 68 2f 52 61 6d 6e 61 64 20 39 ef 80 99 31 |rch/Ramnad 9...1|
00000020 34 ef 80 99 31 30 09 44 53 43 5f 30 30 30 36 2e |4...10.DSC_0006.|
Затем я запустил
>>> entrydict = {}
>>> ec = 0
>>> with open('full.tsv', 'r') as fulltsv:
for line in fulltsv:
columns = line.strip().split('\t')
if not columns[2].startswith('.'):
if columns[2] not in entrydict.keys():
entrydict[str(columns[2])] = []
entrydict[str(columns[2])].append({'path': columns[0], 'filename': columns[1], 'status': True})
if len(entrydict[str(columns[2])]) > 1:
ec += 1
>>> entrydict
{'hash': [{'path': './Personal Research/Ramnad 9\uf01914\uf01910', 'filename': 'DSC_0006.JPG', 'status': True}]}`
И наконец:
>>> e = entrydict['hash'][0]
>>> e
{'path': './Personal Research/Ramnad 9\uf01914\uf01910', 'filename': 'DSC_0006.JPG', 'status': True}
>>> NROOT='foo'
>>> if e['status'] is True:
p = e['path'] # path
n = e['filename'] # name
n0,n0ext = os.path.splitext(n)
n1 = n
# directory structure for new file
FROOT = p.replace(p.split('/')[0],NROOT,1)
rebk = 'mv {0}/{1} {2}/{3}'.format(FROOT,n,p,n)
print(rebk)
src='{0}/{1}'.format(p,n)
dst='{0}/{1}'.format(FROOT,n)
os.makedirs(FROOT)
shutil.move(src,dst)
и все заработало. Облом.