读取csv,如果我的with
块中有任何前面的语句,我发现我无法遍历行。
例如,如果我这样做:
with open (TargetFile) as source:
Strings = csv.reader(source)
for row in Strings:
print Strings.line_num
我将打印到控制台的整数1 - (行数)。 (没用,是的,但我只是用明显的东西测试for
。)
然而,说我想随意抓一排。我想首先确定行数并在该范围内生成一个随机数,然后迭代遍历行以搜索匹配的line_num。
(在这里,我保留了无用的print Strings.line_num
,以避免在混音中引入新的错误。)
with open (TargetFile) as source:
Strings = csv.reader(source)
CSV_Length = sum(1 for row in Strings)
print CSV_Length
RandRow = random.randrange(1,CSV_Length)
print RandRow
for row in Strings:
print Strings.line_num
#replace ^ with actually useful code
将csv文件中的行数和该范围内的随机整数打印到控制台 - 全部按预期方式 - 但不会调用(以前正在工作的)for
循环。没有那个循环,我无法找到有用和有趣的位
我在这里错过了什么?
答案 0 :(得分:1)
你错过了Strings
是一个迭代器。一旦你迭代它以获得长度,它就会耗尽。所以for循环现在无需操作。
您可以通过立即转换为列表来解决此问题:
strings = list(csv.reader(source))
完成此操作后,您现在可以访问len(strings)
以获取长度。
答案 1 :(得分:0)
正如丹尼尔所说,问题是你正在迭代文件中的行。然而,正确的解决方案是回放文件:
Source.seek(0, 0)
这会让你回到文件的开头。