首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重置csv.DictReader(StringIO.StringIO(some_string))

重置csv.DictReader(StringIO.StringIO(some_string))
EN

Stack Overflow用户
提问于 2013-03-12 10:46:09
回答 1查看 2.4K关注 0票数 1

我使用的是python的csv.DictReader,但我用如下所示的字符串将其初始化:

代码语言:javascript
复制
dict_reader = csv.DictReader(StringIO.StringIO(some_string))

有没有办法重置DictReader的迭代器,以便我可以多次使用它?我不希望重新解析some_string,因为它可能是一个昂贵的操作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-12 12:53:50

正如您可能已经知道的,初始化:

代码语言:javascript
复制
dict_reader = csv.DictReader(StringIO.StringIO(some_string))

实际上并不从StringIO.StringIO实例中读取任何内容。只有当您开始从dict_reader中抓取行并逐行读取输入时,它才开始读取。换句话说,它将只读取与您请求的行数相同的行数。下面是一个示例:

代码语言:javascript
复制
#! /usr/bin/env python
import csv
try:
    from StringIO import StringIO   # Python 2.x
except ImportError:
    from io import StringIO         # Python 3.x

test_string = """name,value
foo,1
bar,2
"""

string_io = StringIO(test_string)
# 
# Position is 0 i.e. the beginning of the string.
# 
print("Position: {}".format(string_io.tell()))

dict_reader = csv.DictReader(string_io)
#
# Position is still 0. Nothing has been read.
#
print("Position: {}".format(string_io.tell()))
#
# Now we start reading from string_io
#
for row in dict_reader:
    print(row)
    #
    # Position increases every time you read 
    # a row using dict_reader.
    #
    print("Position: {}".format(string_io.tell()))

这将打印以下内容:

代码语言:javascript
复制
Position: 0
Position: 0
{'name': 'foo', 'value': '1'}
Position: 17
{'name': 'bar', 'value': '2'}
Position: 23

在所有这些操作的结尾,string_io中的当前位置将指向字符串的末尾。因此,即使您可以重用dict_reader,您也必须首先查找string_io的开头,然后重新开始扫描。实际上,您可以在上面的代码之后执行以下操作:

代码语言:javascript
复制
string_io.seek(0)
for row in dict_reader:
    print(row)
    print("Position: {}".format(string_io.tell()))

for循环将打印以下内容:

代码语言:javascript
复制
{'name': 'name', 'value': 'value'}
Position: 11
{'name': 'foo', 'value': '1'}
Position: 17
{'name': 'bar', 'value': '2'}
Position: 23

请注意,dict_reader现在将string_io的第一行视为数据,而不是使用它来决定字段的名称。此外,dict_reader本身并不保留它已扫描的所有行。一旦将行传递给您,它就不再通过dict_reader可用。您可以从csv.py中的csv.DictReader.next()_csv.c中的Reader_iternext()的定义中看到这一点。因此,您最好按照注释中的建议将行存储在您自己的位置。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15352417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档