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

Eri*_*rik 1 python csv

我正在使用python的csv.DictReader,但我用这样的字符串初始化它:

dict_reader = csv.DictReader(StringIO.StringIO(some_string))
Run Code Online (Sandbox Code Playgroud)

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

cra*_*ulf 6

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

dict_reader = csv.DictReader(StringIO.StringIO(some_string))
Run Code Online (Sandbox Code Playgroud)

实际上并没有从StringIO.StringIO实例中读取任何内容.在dict_reader当你开始仅开始读抓住从中行,它读取输入行由行.换句话说,它只会读取与您询问的行数一样多的行.这是一个例子:

#! /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()))
Run Code Online (Sandbox Code Playgroud)

这将打印:

Position: 0
Position: 0
{'name': 'foo', 'value': '1'}
Position: 17
{'name': 'bar', 'value': '2'}
Position: 23
Run Code Online (Sandbox Code Playgroud)

在所有这一切结束时,当前位置string_io将指向字符串的结尾.所以,即使你可以重复使用,dict_reader你也必须寻求string_io第一个开始并再次开始扫描它.实际上,您可以在上面的代码之后执行以下操作:

string_io.seek(0)
for row in dict_reader:
    print(row)
    print("Position: {}".format(string_io.tell()))
Run Code Online (Sandbox Code Playgroud)

for循环将打印以下内容:

{'name': 'name', 'value': 'value'}
Position: 11
{'name': 'foo', 'value': '1'}
Position: 17
{'name': 'bar', 'value': '2'}
Position: 23
Run Code Online (Sandbox Code Playgroud)

请注意,dict_reader现在将第一行string_io视为数据,而不是使用它来决定字段的名称.此外,dict_reader它本身并不保留它扫描的所有行.一旦传递给您,它就不再可用了dict_reader.您可以从定义看这csv.DictReader.next()csv.pyReader_iternext()_csv.c.因此,最好按照评论中的建议将行存储在某个地方.