【问题标题】:Python CSV toublePython CSV 文件
【发布时间】:2020-05-15 04:43:48
【问题描述】:

我编写了一个代码,它使用 readlines() 逐行读取一个非常大的 CSV 文件。我使用全局变量调用该函数并访问该变量以搜索特定单词并计算它在文件中出现的次数。

def init(filename):
    global lines
    with open(filename) as file:
        lines = file.readlines()


def total():
    males = 0
    females = 0
    for i in range(0, len(lines)):
        current_line = lines[i].split(",")
        if current_line[5] == 'M\n':
            males += 1
        elif current_line[5] == 'F\n':
            females += 1

    total_dict = {"Gender": {"M": males, "F": females}}
    return total_dict

由于某种原因,此代码适用于较小的文件,但我似乎无法使用超大文件。

【问题讨论】:

  • 你能解释一下处理大文件时到底出了什么问题吗?

标签: python csv readline


【解决方案1】:

如果“超大”是指 RAM 无法容纳的内容,那么这很正常:您在 RAM 中读取整个文件,然后一次处理一行:为什么不逐行读取文件然后?你可以做for line in file: ...

def total(name):
    males = females = 0
    with open(name, "rt") as f:
        for line in f:
            current = line.rstrip("\r\n").split(",")
            if current[5] == "M":
                males += 1
            elif current[5] == "F":
                females += 1
    return {"Gender": {"M": males, "F": females}}

或使用Counter(它就像一个字典,但您不必初始化零值,当您执行gender[...] += 1 时会自动添加条目):

from collections import Counter

def total(name):
    gender = Counter()
    with open(name, "rt") as f:
        for line in f:
            current = line.rsplit("\r\n").split(",")
            gender[current[5]] += 1
    return {"Gender": gender}

另请注意,要读取 CSV 文件,您可以使用 csv 模块。

import csv

def total(name):
    gender = Counter()
    with open(name, "rt") as f:
        for current in csv.reader(f):
            gender[current[5]] += 1
    return {"Gender": gender}

另一个编码建议,与您当前的问题没有直接关系:避免使用全局变量,除非有充分的理由使用全局变量:如果您坚持阅读 init 中的 while 文件,您可以简单地返回列表。并且在遍历列表时,不要使用for i in range(len(a)): 中的范围,而是改写for x in a:,除非您出于某种原因确实需要索引。如果需要索引,通常最好写for i, x in enumerate(a):

【讨论】:

    猜你喜欢
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2020-03-04
    • 2011-08-30
    • 2015-11-28
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多