【问题标题】:Reading from CSVs in Python repeatedly?反复从 Python 中读取 CSV?
【发布时间】:2011-02-21 12:56:53
【问题描述】:

我正在尝试根据我已有的 csv 检查提取数据的值。它只会遍历 CSV 的行一次,我只能检查 feed.items() 的一个值。我需要在某处重置一个值吗?有没有更好/更有效的方法来做到这一点?谢谢。

orig = csv.reader(open("googlel.csv", "rb"), delimiter = ';')
goodrows = []
for feed in gotfeeds:    
   for link,comments in feed.items():
       for row in orig:
           print link
           if link in row[1]:
               row.append(comments)
               goodrows.append(row)

【问题讨论】:

    标签: python csv


    【解决方案1】:

    orig 设为列表可避免重置/重新解析 csv:

    orig = list(csv.reader(open("googlel.csv", "rb"), delimiter = ';'))
    

    【讨论】:

    • 这在技术上是可行的,但会导致整个 CSV 文件被加载到内存中。如果文件很小,这不是什么大问题,但这不会扩展。
    • @Chris。真的。如果 csv 文件很大,我希望他在问题中提到这一点,但我们的解释肯定有空间。
    • 我同意 Chris S 的观点。我们遇到了同样的问题 .. 最终我们的 CSV 文件达到了 5gb。不用说,这是一场噩梦
    • 在速度和空间之间进行权衡。如果你有空间,使用列表会更快,因为不会重新解析 csv。这不是哪种方法更好的问题,而是哪种方法更适合 OP 的情况。由于他没有解释 CSV 有多大,因此任何一种方法都可能更合适。
    • 根据我的经验,最好规划可扩展性,然后假设没有必要。在这种情况下,使其可扩展也不会减慢它的速度,因为 CSV 解析相当简单。
    【解决方案2】:

    您可以通过重置文件对象的读取位置来“重置”CSV 迭代器。

    data = open("googlel.csv", "rb")
    orig = csv.reader(data, delimiter = ';')
    goodrows = []
    for feed in gotfeeds:    
       for link,comments in feed.items():
           data.seek(0)
           for row in orig:
               print link
               if link in row[1]:
                   row.append(comments)
                   goodrows.append(row)
    

    【讨论】:

    • 效果很好,谢谢。我的文件在不久的将来很小,但我不想在几个月后找出它变慢的原因。
    猜你喜欢
    • 2013-01-21
    • 2020-10-19
    • 1970-01-01
    • 2017-08-13
    • 2017-03-11
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多