如何提高读取csv档案所执行的时间~?

大家好,小弟有一个程式码是读取csv档案,里面总共有100多万行,然后有10栏,以下程式码是可以正常执行,但是以下程式码会读了10次100多万行而导致很花时间,读取所花的时间大概80几秒。

import os 
import sys
import csv
import time
tStart = time.time()#計時開始

def _input_file_(file_name,line_num):
    with open(file_name, newline='', encoding='utf-8') as csvfile:
        lines = csv.reader(csvfile)
        columns = [line[line_num] for line in lines]
        return columns
def _output_file_(file_name, file_type, D0):
    with open(file_name, file_type, newline='', encoding='utf-8') as csvfile:
        csvfile.writelines(D0)

input_file = '10_CA_BQ_Author_Merge/CA_Original_Data_Merge_BQ_Author_Num.csv'
#output_file = '10_CA_BQ_Author_Merge/CA_Complete_Data.csv'

col_0 = _input_file_(input_file,0) #帖子編號
col_1 = _input_file_(input_file,1) #帖子標題
col_2 = _input_file_(input_file,2) #發言作者
col_3 = _input_file_(input_file,3) #發表時間
col_4 = _input_file_(input_file,4) #發言內容
col_5 = _input_file_(input_file,5) #是否第一作者?
col_6 = _input_file_(input_file,6) #引用作者
col_7 = _input_file_(input_file,7) #引用內容
col_8 = _input_file_(input_file,8) #是否有引用?
col_9 = _input_file_(input_file,9) #num

print(len(col_0))
print(len(col_1))
print(len(col_2))
print(len(col_3))
print(len(col_4))
print(len(col_5))
print(len(col_6))
print(len(col_7))
print(len(col_8))
print(len(col_9))

#程式執行完成
tEnd = time.time()#計時結束
#列印結果
print("執行時間 %f 秒" % (tEnd - tStart))#會自動做近位

对于以上程式码的设计,我目前还不知道有什么方式可以让程式不会重复10次读100多万行资料,我是想把每个栏位的每行存成一个list,希望大家可以协助以下我解决这个问题,谢谢你们。

csv
Jason990420
最佳答案

试试这个, col[0] ~ col[9]

import csv

def _input_file_(filename):
    with open(filename, newline='', encoding='utf-8') as f:
        data = csv.reader(f)
        columns = tuple(zip(line for line in data))
    return columns

input_file = '10_CA_BQ_Author_Merge/CA_Original_Data_Merge_BQ_Author_Num.csv'

col = _input_file_(input_file)
3年前 评论
讨论数量: 3
pardon110

只读一次源文件,用字典关联每列数据列表,返回结果集

def _input_file_(file_name):
    columns = {}
    with open(file_name, newline='', encoding='utf-8') as csvfile:
        lines = csv.reader(csvfile)
        for line in lines:
            for i,column in enumerate(line):
                if columns.get('col_%d' % i):
                    columns['col_%d' % i].append(column)
                else:
                    columns['col_%d' % i]=[column]
    return columns
3年前 评论
Jason990420

试试这个, col[0] ~ col[9]

import csv

def _input_file_(filename):
    with open(filename, newline='', encoding='utf-8') as f:
        data = csv.reader(f)
        columns = tuple(zip(line for line in data))
    return columns

input_file = '10_CA_BQ_Author_Merge/CA_Original_Data_Merge_BQ_Author_Num.csv'

col = _input_file_(input_file)
3年前 评论

主要问题在于你调用了十次函数。应该是将函数执行一次返回一个结果,然后在返回结果里面再做数据结构上的操作,就可以避免重复执行函数读取读取csv文件。

你可以比较一下目前回答的三种方式执行时间,我比较了1楼、2楼和我这个,10万行数据,差距在0.3s和0.05s左右。

我用了列表推导式:

all_column_list =  [[line[i]  for line in all_columns]  for i in  range(10)]
import os 
import sys
import csv
import time
from functools import wraps


def _input_file_(file_name):
    with open(file_name, newline='', encoding='utf-8') as csvfile:
        lines = csv.reader(csvfile)
        columns = [line for line in lines]
        return columns

def t1(input_file):
    all_columns = _input_file_(input_file)
    # print(all_columns)

    # 用列表推导式获取所有列元素组成的列表
    all_column_list = [[line[i] for line in all_columns] for i in range(10)]

    col_0 = all_column_list[0] #帖子編號
    col_1 = all_column_list[1] #帖子標題
    col_2 = all_column_list[2] #發言作者
    col_3 = all_column_list[3] #發表時間
    col_4 = all_column_list[4] #發言內容
    col_5 = all_column_list[5] #是否第一作者?
    col_6 = all_column_list[6] #引用作者
    col_7 = all_column_list[7] #引用內容
    col_8 = all_column_list[8] #是否有引用?
    col_9 = all_column_list[9] #num

    print(col_0)
    print(col_1)
    print(col_2)
    print(col_3)
    print(col_4)
    print(col_5)
    print(col_6)
    print(col_7)
    print(col_8)
    print(col_9)

input_file = './test1.csv'
t2(input_file)

file

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!