如何替换tablib数据集中的值?

时间:2016-05-10 15:38:04

标签: python replace

我正在使用tablib库,并希望将具有特定值的所有条目替换为另一个值。 .first(20)对象似乎不支持此操作。实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

我的解决方案是在导出为replace的字符串上调用Python的字符串Dataset方法,然后将字符串加载回新的Dataset。要重新加载字符串,需要将其保存为内存中的流。应该可以使用更高级的字符串替换技术,如正则表达式。

以下是一个例子:

import tablib
import io

# Creating an example dataset.
data = tablib.Dataset()
data.headers = ('first_name', 'last_name')
data.append(('John', 'Adams'))
data.append(('George', 'Washington'))
print(data.csv)
# Calling replace() on the formatted string and store it in a stream.
stream = io.StringIO(data.csv
                     .replace('George', 'Donald')
                     .replace('Washington', 'Trump'))
new_data = tablib.Dataset().load(stream.read(), format='csv')
print(new_data.csv)

虽然解决方案似乎有点“hacky”,而且这个例子很无聊,但似乎有用。

答案 1 :(得分:0)

您可以使用标签创建子集,或使用第二个中间数据集。 .height为您提供行数,.lpop()返回并将第一行作为元组删除,.append()将行添加回来,.stack()将两个数据集合并在一起。您可以针对提取的元组正常运行测试或代码。

import tablib

data = tablib.Dataset()
data.headers = ('first_name', 'last_name')
data2 = tablib.Dataset()
data2.headers = ('first_name', 'last_name')

data.append(('John', 'Adams'))
data.append(('George', 'Washington')) 

for x in range(0, data.height):
    col1, col2 = data.lpop()
    if col2 == 'Adams':
        col2 = "Eves"
    data2.append((col1, col2))
data = data.stack(data2)

这种方法坚持使用tablib,避免了加载第二次导入。