我正在使用tablib
库,并希望将具有特定值的所有条目替换为另一个值。 .first(20)
对象似乎不支持此操作。实现这一目标的最佳方法是什么?
答案 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,避免了加载第二次导入。