【问题标题】:Unicode portability with PyQT4/numpy on linuxUnicode 可移植性与 Linux 上的 PyQT4/numpy
【发布时间】:2013-08-06 22:14:29
【问题描述】:

我正在用 pyQT4 和 numpy 开发一个多平台应用程序,实际上它在我的 linux 系统(Xubuntu 12.04)上不起作用,即使它在 Windows 7 上看起来效果很好。所以,问题来自我的导入文件方法(它在 PyQT4 类中):

def import_folder(self,abs_path,folder_list):
    for folder_i in folder_list:
        filenames = glob.glob("%s/%s/*.txt" %( abs_path,folder_i ))
        aa =list(filenames)[1]
        print filenames
        data_fichier = np.genfromtxt("%s" %(aa),delimiter=';',skip_header=35,usecols=[8])
        data_fichier2 = np.zeros((data_fichier.shape[0],))

这是我得到的错误:

     data_fichier = np.genfromtxt("%s" %aa,delimiter=';',skip_header=35,usecols=[8])
     File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 1241, in genfromtxt
     fhd = iter(np.lib._datasource.open(fname, 'rbU'))
     File "/usr/lib/python2.7/dist-packages/numpy/lib/_datasource.py", line 145, in open
      return ds.open(path, mode)
     File "/usr/lib/python2.7/dist-packages/numpy/lib/_datasource.py", line 472, in open
found = self._findfile(path)
     File "/usr/lib/python2.7/dist-packages/numpy/lib/_datasource.py", line 315, in _findfile
     filelist += self._possible_names(self.abspath(path))
     File "/usr/lib/python2.7/dist-packages/numpy/lib/_datasource.py", line 364, in abspath
     splitpath = path.split(self._destpath, 2)
     UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 14: ordinal not in range(128)

我已经打印了我的“文件名”变量:

   [u'/home/*****/Documents/Plate_test/Track-Arousal_experiment_24_06_13_track_1-Trial     2-7-Subject 1.txt', u'/home/*****/Documents/Plate_test/Track-Arousal_experiment_24_06_13_track_1-Trial     2-5-Subject 1.txt']

因此,问题来自 unicode 模式(列表元素开头的“u”)。而且我完全不知道为什么我的 linux 系统会使用这种 unicode 模式。你有什么想法我可以如何删除它并以“常规”模式打开(对不起术语,我不是专家)? (或其他关于我的问题的想法)。

(只是为了你知道,当我将该方法作为一个没有 PyQT 的简单函数启动时 类,效果很好,所以我怀疑它。)

谢谢,

雷姆

【问题讨论】:

    标签: python unicode numpy ascii pyqt4


    【解决方案1】:

    似乎loadtxt 方法需要str 而不是unicode,因为它试图对其进行解码。 glob 在您的情况下返回 unicode 字符串,因此请尝试对您的文件名进行编码:

    filenames = map(str, filenames)
    

    或者

    filenames = map(lambda f: f.encode('utf-8'), filenames)
    

    甚至:

    def safe_str(s):
        if isinstance(s, unicode):
            return s.encode('utf-8')
        return s
    filenames = map(safe_str, filenames)
    

    【讨论】:

    • 非常感谢...这很容易!现在它可以正常工作了。但我不明白为什么我需要在我的 Linux 系统上而不是在 Windows 7 上这样做。可能是关于不同的 python 版本吗?
    • 由于某种原因,abs_pathfolder_list 在您的 linux 系统上是 unicode,而 glob 返回一个 unicode 列表。我必须查看其余代码才能对其进行调试...
    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多