【问题标题】:CSV manipulaions with python使用 python 进行 CSV 操作
【发布时间】:2012-10-27 06:40:49
【问题描述】:

出于我的目的,在实际处理行之前,我必须知道 (CSV) 文件中的行数。我用谷歌搜索,发现文档说我应该创建一个迭代器(CSV.reader)两次(第一次用于计数,第二次用于处理行)。这是唯一的方法,还是有一些棘手的方法可以做到这一点?

感谢您的回答。

【问题讨论】:

  • 首先我们需要了解为什么在使用它们之前需要行数
  • 如果行数 > N(每个用户的 N 不同)我不应该处理该文件。
  • 至少对我来说似乎没有其他方法可以做到这一点-无论如何阅读所有行并继续所有行都是不同的东西-所以我建议您阅读所有内容而不是签入大小,如果可以继续行 - 否则切换到下一个文件

标签: python csv iterator


【解决方案1】:

如果你的文件不是很大,你可以试试:

from csv import reader

def proceed(size):
    with open(filename) as f:
        data = list(csv.reader(f))
        if len(data) > size:
            return
        else:
            for line in data:
                #do action


weights = {'user1': 4, 'user2': 5}  
for k,v in weights.iteritems():
    proceed(v)

或者如@georgesl 所建议的那样,以防你有一个非常大的文件:

def proceed(size):
    if sum(1 for row in csv.reader(open(filename))) > size:
        return
    else:
        for line in csv.reader(open(filename)):
            #do action

【讨论】:

  • 文件的合适大小是多少? 100KB 呢?
  • 如果您的文件很大,也许row_count = sum(1 for row in csv.reader( open('filename.csv') ) ) 更适合大小
  • @alexvassel 适当的文件大小是任何不会让您的机器陷入昏迷的文件 - 1gb CSV 文件可能不会对大多数现代机器造成压力......
【解决方案2】:

我不知道不读取文件的方法,但是根据您的瓶颈所在位置,您可以只处理 N 行,如果有更多则丢弃它们,例如:

count = 0
for line in reader:
    count += 1
    if count > N:  # Over the limit so stop processing
        break
    else:
        processed_data += process(line)
else:
    # This block only runs if the loop completed naturally, i.e. count <= N
    return processed_data

如果process(line) 很昂贵,那么最好的选择可能是使用问题中描述的两个循环。

【讨论】:

    猜你喜欢
    • 2015-08-12
    • 2019-08-26
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2020-11-08
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多