Python 组合pandas和shutil时与解码相关的错误

Python 组合pandas和shutil时与解码相关的错误,python,pandas,encoding,shutil,Python,Pandas,Encoding,Shutil,我试图用shutil.copytree和pandas(apply函数)复制一堆目录。在检查日志时,我注意到由于以下错误,无法复制某些文件:[Errno 2]没有这样的文件或目录:PATH。即使路径名是有效的。进一步检查后发现\xb4中的Í字符发生了更改,这解释了为什么找不到该文件 我在这篇文章中尝试了以下建议: 通过尝试将列转换为unicode。但是,这会导致以下错误: UnicodeDecodeError:“ascii”编解码器无法解码位置20处的字节0xcc:序号不在范围内(128) 我希

我试图用shutil.copytree和pandas(apply函数)复制一堆目录。在检查日志时,我注意到由于以下错误,无法复制某些文件:[Errno 2]没有这样的文件或目录:PATH。即使路径名是有效的。进一步检查后发现\xb4中的Í字符发生了更改,这解释了为什么找不到该文件

我在这篇文章中尝试了以下建议: 通过尝试将列转换为unicode。但是,这会导致以下错误: UnicodeDecodeError:“ascii”编解码器无法解码位置20处的字节0xcc:序号不在范围内(128)

我希望字符串“DONE”会被打印出来,但是我得到了错误消息:

[Errno 2]没有这样的文件或目录:“Y:\project\Test\x01\RAI\xcc\x81.pdf”

编辑:

如果像这样使用原始字符串文字:

df = pd.DataFrame({r'1':[r'Y:\project\Test\1'],
              '2':[r'Y:\project\Test\2']})

def copy_files(row):
    try:
        shutil.copytree(row['1'], row['2'])
        return 'DONE'
    except Exception as e:
        return str(e)

df['errors'] = df.apply(copy_files, axis=1)

print(df['errors'][0])
我仍然得到以下结果:

[('Y:\project\Test\1\RAI\xb4i.pdf', “Y:\project\Test\2\RAI\xb4i.pdf”,“[Errno 2]没有此类文件或 目录:“Y:\\project\\Test\\1\\RAI\xb4i.pdf'”)


你从哪里得到这些角色的?看起来你的名字里有一个“带锐音符的拉丁文大写字母I”。问题在于UNICODE(独立于编码)允许多个表示。它可以是(标准形式C或标准组合)U+00CD或
'\xcd'
或(标准形式D或标准分解)U+0049,后跟U+0301或
'I\u0301'
。这张NFD表格读作拉丁文大写字母I,后面加上尖锐的口音

无法在打印或显示的字符上区分这两种形式,但不幸的是,它们对于Python和文件系统都是不同的字符串

如何修复:避免在文件名中使用非ascii字符。你现在知道为什么了

解决办法:

  • 您的源包含NFD表单。文件系统可能包含NFC表单,因此您可以尝试:

    df = pd.DataFrame({'1':['Y:\project\Test\1\RAI\xcd.pdf'],'2': 
    ['Y:\project\Test\2\RAI\xcd.pdf']})
    
  • 防弹方法是询问文件系统文件名实际上是什么字符串:

    l = glob.glob('Y:\project\Test\1\RAI*.pdf')
    for name in l:
        print(name, [hex(ord(i)) for i in name])
    
    (请注意
    *
    而不是
    ,因为在NFD格式中,单个glyph可能对应多个字符),这将转储文件系统已知的所有字符的unicode码点。如果你以后使用完全相同的表示法,事情会好起来的


  • 参考文献:


    想知道为什么在输出错误中看到\xo1而不是“1”
    l = glob.glob('Y:\project\Test\1\RAI*.pdf')
    for name in l:
        print(name, [hex(ord(i)) for i in name])