【发布时间】:2020-12-05 15:08:39
【问题描述】:
我正在尝试在 python 中使用 pyreadstat 读取 sav 文件,但在一些罕见的情况下,由于字符串变量具有特殊字符,我收到了 UnicodeDecodeError 错误。
为了处理这个问题,我认为我不会加载整个变量集,而是只加载没有此错误的变量。
以下是我随身携带的伪代码。这不是一个非常有效的代码,因为我使用 try 和 except 检查列表的每个项目中的错误。
# Reads only the medata to get information about the variables
df, meta = pyreadstat.read_sav('Test.sav', metadataonly=True)
list = meta.column_names # All variables are stored in list
result = []
for var in list:
print(var)
try:
df, meta = pyreadstat.read_sav('Test.sav', usecols=[str(var)])
# If no error that means we can store this variable in result
result.append(var)
except:
pass
# This will finally load the sav for non error variables
df, meta = pyreadstat.read_sav('Test.sav', usecols=result)
对于包含 1000 多个变量的 sav 文件,处理它需要很长时间。 我在想是否有一种方法可以使用分而治之的方法并更快地做到这一点。以下是我建议的方法,但我在实现递归算法方面不是很好。有人可以帮我用伪代码吗,这将非常有帮助。
- 获取列表并尝试读取 sav 文件
- 如果没有错误,则可以将输出存储在结果中,然后我们读取 sav 文件
- 如果出现错误,则将列表分成两部分并再次运行它们......
- 第 3 步需要再次运行,直到我们得到一个没有给出任何错误的列表
使用第二种方法,我 90% 的 sav 文件将在第一遍时加载,因此我认为递归是一个好方法
您可以尝试重现 sav 文件 here 的问题
【问题讨论】:
-
将任何对象添加到列表中应该没有错误。你肯定又迈出了一步。为什么不识别导致问题的对象类型并以这种方式处理它们。或者更好的是,在错误有机会提出之前找出错误的原因。
-
为什么不分享你正在做的操作,以便我们可以看到问题所在。
-
另外,我认为您的第二种方法比第一种方法效率低,因为您必须多次执行许多计算。
-
list.append(i) 应该没有单一的问题,它会追加它找到的任何内容。可能您遇到的问题是读取数据时,是txt还是csv?
-
在 python 中使用递归不会为您的情况增加任何好处。迭代“通常”更快。此外,在 python 中使用递归时,总是有可能遇到堆栈限制错误。也许您可以考虑多线程或多处理方法。
标签: python arrays list spss divide-and-conquer