路径名中的编码字符

时间:2019-04-15 10:56:10

标签: python

我使用的是Python版本:2.7.12 | Anaconda 4.1.1(64位)| (默认值,2016年6月29日,11:07:13)[MSC v.1500 64位(AMD64)](Windows 7)

我在脚本中使用lz4,并且在使用lz4.frame.open()读取文件时遇到问题

文件名来自PyQt4的选择文件对话框,并在调用lz4.frame.open()之前转换为编码为'utf-8'的unicode:

C:/Users/user/Desktop/δθμ/PREVIEW/Questionnaire.db
<type 'unicode'>

如果代码运行为

#fl = fl.encode('utf-8')
 with lz4.frame.open(fl, mode='r') as f:

我得到一个

    'filename must be a str, bytes, file or PathLike object'
TypeError: filename must be a str, bytes, file or PathLike object

如果代码运行为

fl = fl.encode('utf-8')
with lz4.frame.open(fl, mode='r') as f:

我得到

    self._fp = builtins.open(filename, mode)
IOError: [Errno 2] No such file or directory: 'C:/Users/user/Desktop/\xce\xb4\xce\xb8\xce\xbc/PREVIEW/Questionnaire.db'

错误。

有什么想法可以解决吗?

编辑1 : 这不是重复项。正如我提到的那样,在函数调用之前,由filedialog返回的字符串已使用unicode(fl,'utf-8')转换为unicode,但在这种情况下或在已使用'utf- 8'。您提到的链接中的问题是对话框返回的字符串没有像应按qstring类型那样对待

编辑2 : 如果将“δθμ”更改为拉丁字符,则代码将按预期运行

fl = fl.encode('utf-8')
with lz4.frame.open(fl, mode='r') as f:

但是必须处理带有此类字母甚至空格的文件夹。

1 个答案:

答案 0 :(得分:1)

错误提示:文件名必须是str,字节,文件或PathLike对象:

if sys.version_info > (3, 6):
    path_test = isinstance(filename, (str, bytes, os.PathLike))
else:
    path_test = isinstance(filename, (str, bytes))

我使用以下代码创建了源文件:

FL = u"δθμ.txt"
DATA = open(r"source.js", "rb").read()
LZ4_DATA = lz4.frame.compress(DATA)

# write compressed data to a file
with open(FL, "wb") as _file:
    _file.write(LZ4_DATA)

然后我给他一个文件对象的实例:

# read compressed data from a file
with open(FL, "rb") as _file:
    with lz4.frame.open(_file) as f:
        print(f.read())

它有效。