Python中的python的csv.reader似乎并没有真正获得任何数据

时间:2017-06-26 14:24:32

标签: python csv sqlite

我正在编写一个脚本,需要在脚本中多次使用csv.reader()。我在脚本的早期使用它来填充带有初始主键数据的sqlite3表。然后我再次使用它来根据csv中的内容改变表的数据(我保证这个订单有合理的原因)。

问题出现了第二次 - 我的sqlite3表肯定是用第一个csv阅读器填充的,这意味着第一个csv.reader()可以工作,因为那是数据的来源。但是,当我稍后迭代它时,没有数据。看起来csv.reader()完全是空的。

csv.reader()是否只允许每个脚本使用一个csv.reader()对象?我无法想象那种情况。

这是有效的代码:(用初始数据填充我的表)

<header>
  <div id="Logo">
  <img src="C:\Users\Mihajlo\Desktop\retardirani mihajlo\reeee1.png" width="196px" height="124px">
</div>
<nav>
  <li><a href="#">HOME</a></li>
  <li><a href="#">ABOUT</a></li>
  <li><a href="#">CATALOG</a></li>
  <li><a href="#">CONTACT</a></li>
</nav>
</header>

以下是同一脚本中不会出现的代码:

for file in files:
    f = open(file)
    csv_f = csv.reader(f)
    count = 0
    for row in csv_f:
        #more code
    f.close()

列表的类型不是什么吓坏了,对吧?我对如何解决这个问题感到很茫然。

1 个答案:

答案 0 :(得分:0)

list(csv_n)表达式将生成list csv行:

>>> import csv
>>> f = open("ooo.csv", "rb")
>>> r = csv.reader(f)
>>> list(r)
[['a', 'b', 'c'], ['1', '2', '3']]

a&#34;类型转换&#34; (提示:没有&#34;类型转换&#34;在Python中),会改变你的&#34; csv&#34;进入其他任何事情。

>>> r
<_csv.reader object at 0x7f34964b7600>

实际上它完全与手动构建列表相同,即使用:

>>> lst = []
>>> for row in r:
>>>    lst.append(row)

但速度更快,代码更少。

唯一的副作用是 - 就像手动迭代一样 - 它将读取整个文件,因此将文件指针设置在文件的末尾,因此尝试重用相同的csv阅读器(或文件本身) )没有像预期的那样工作。如果要重新读取csv,则必须在开头重置文件指针:

>>> r.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> f.seek(0)
>>> r.next()
['a', 'b', 'c']

所以无论你的问题是什么(&#34;一切都被打破&#34;完全无用的问题描述BTW),它不是使用list(csv_n),而是很可能不理解它的作用。

NB:你写的那个

  

然而,当我稍后迭代它时,没有数据。看起来csv.reader()完全是空的

如果您尝试在<{strong> csv_n行之后迭代thisList = list(csv_n) ,那么当然您将无法获得任何结果,cf以上。只需将文件指针倒回到开头,就可以了。