与合并熊猫和shuti时的解码有关的错误

时间:2019-05-29 11:15:53

标签: python pandas encoding shutil

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

我已尝试按照本文中的建议进行操作: Pandas convert object column to str - column contains unicode, float etc 通过尝试将列转换为unicode。但是,这导致以下错误: UnicodeDecodeError:“ ascii”编解码器无法解码位置20的字节0xcc:序数不在range(128)

import pandas as pd
import shutil

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

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

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

print(df['errors'][0])

我希望将打印字符串“ 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'“)]

1 个答案:

答案 0 :(得分:1)

您从哪里得到这些角色?您的姓名似乎包含“带有大写字母的拉丁文大写字母”。问题是UNICODE(独立于编码)允许多个表示。它可以是(普通形式C或规范组成)U + 00CD或'\xcd'或(普通形式D或规范分解)U + 0049,后跟U + 0301或'I\u0301'。将此NFD表格读为“拉丁文大写字母I”,后跟“合并重音”。

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

如何解决:避免在文件名中使用非ASCII字符。您现在知道为什么...

解决方法:

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

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

    l = glob.glob('Y:\project\Test\1\RAI*.pdf')
    for name in l:
        print(name, [hex(ord(i)) for i in name])
    

    (请注意*而不是?,因为在NFD中,单个字形可能对应多个字符)这将转储文件系统已知的所有字符的unicode代码点。如果您以后使用完全相同的表示形式,则应该没问题。


引用: