添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
酷酷的排球  ·  module' object has no ...·  6 天前    · 
儒雅的豌豆  ·  python 类 属性 ...·  3 天前    · 
粗眉毛的青蛙  ·  spark ...·  昨天    · 
失恋的鞭炮  ·  PYTHON利用ElementTree解析X ...·  10 小时前    · 
从容的金针菇  ·  c# - XAML: Visibility ...·  1 年前    · 

在Python中写一个列表到csv文件,不需要循环操作

4 人关注

我有一个列表,需要写到csv文件中。

mylist = [['Siddharth','Bangalore','blah@gmail.com'],  
        ['Rahul','Bangalore','blah2@gmail.com'],.....and so on]  

这个名单通常有大约2万到4万条。
所以,现在,将它们写入csv文件的唯一方法是在列表上迭代并写入。

fileObj = open("/home/siddharth/sample.csv", "wb")
csv_file = csv.writer(fileObj)  
for item in mylist:  
    csv_file.writerow(item)  

所以,我只是想知道,有没有一种方法可以将这样的列表写入csv,而不需要对列表中的每一项进行迭代,例如,像使用StringIO等。
或者,谁能给出一些提示/暗示,以便我能够创建自己的实现。

5 个评论
如果你想提高性能,那么这应该是你的问题。不要以为不循环就能自动提高性能。你不可能消除循环。循环会在某处发生,即使是不明显的。试图消除循环可能会导致整个文件的内容一次性在内存中被处理,这可能会降低效率。
对!非常感谢你的提示。
jfs
运行 python -mcProfile your_script.py ,找出哪些功能花费的时间最多。
好的,将尝试这样做。谢谢!
@MichaelMior--"文件的全部内容都在内存中一次性处理,这可能会降低效率"--你从哪里得知这可能会降低效率?将磁盘i/o转移到内存中以减少磁盘访问的数量是一种常见的性能优化。而且我不认为40,000个元素,每个40-60个字符会给今天的大多数计算机系统带来很大的压力。
python
python-2.7
Siddharth Srivastava
Siddharth Srivastava
发布于 2012-12-27
3 个回答
interjay
interjay
发布于 2012-12-27
已采纳
0 人赞同

有一个 writerows 方法,它将把所有的行添加到一个迭代器中。

csv_file.writerows(the_list)

无论你做什么,总会在某个地方出现一个循环(要么在你的代码中,要么在 Python 库的实现中)。这是没有办法的,因为你需要查看列表中的每一个项目,这样你才能把它们写到文件中。

如果你担心每一行单独写入文件的性能问题。Python 默认使用缓冲 I/O,所以即使你在一个循环中一个一个地写列表项,它们也不一定会那样被写到文件中。每当缓冲区填满时,它们就会被分块写入,这将有更好的性能。如果需要,你可以通过使用buffering的参数来明确地控制缓冲区的大小。open.

是的,正如我所说,它也使用for循环来迭代列表。这与我所做的最终是一样的。
@SiddharthSrivastava:必须在某个地方有一个循环,因为你需要对列表进行迭代,以获得其内容。
是的,没错。我只是想知道,是否可以做一些事情。我知道我这么说听起来很奇怪,但也许可以做一些事情。
而且,感谢你提供关于缓冲I/O的信息。我没有意识到这一点。
这似乎会使我的数据移位--有什么办法可以避免这种情况?
Tim Pietzcker
Tim Pietzcker
发布于 2012-12-27
0 人赞同
csv_file.writerows(mylist)

(Note the s in writerows())

不,如果你看到csvfile.writerows()的源代码,你会发现它也会对列表进行迭代。只需通过它就可以了。
@SiddharthSrivastava:好吧,不然它怎么会把它写到文件里? Someone 必须进行迭代,所以它可能是Python。
jfs
除了它只是把循环移到 csv 模块内。如果不在某个时间点上查看每一项,就没有办法将2D列表写成csv(在列表上进行迭代)。
是的,我知道这是最明显的方法。这就是为什么我问,是否有什么特别的方法,或者一个变通的办法。比如说使用StringIO。
@Sebastian,是的,你是对的,我只是在想,如果我们能想出一些办法:)
PaulMcG
PaulMcG
发布于 2012-12-27
0 人赞同

这些都是字符串的图元?只有40,000个?你试过这个吗?