禁之零零 发表于 2019-8-17 23:31

【笔记】30行代码,低内存占用解读超大csv文件

import shleximport datetime

if __name__ == "__main__":
    File_All_Path = r"D:\1000W行.csv"# 以二进制方式读取文件
    File_ID = open(File_All_Path, "rb")
    LineNumber = 0# 创建行号变量
    Read_Title = False# 创建是否读标题变量
    Start_Time = datetime.datetime.now()# 计时开始
    Line_Decode = "GBK"# 设置编码
    while 1:
      Line_Byte = File_ID.readline()# 读入一行二进制内容
      if not Line_Byte: break# 判断二进制文本是否为空,为空则到文件尾部,跳出循环
      RowTest = Line_Byte.decode(Line_Decode).rstrip()# 编码转换,并去除尾部的换行符号
      LineNumber += 1# 行号变量自增
      if LineNumber == 1 and Read_Title == False: continue# 是否读取第1行标题
      if LineNumber == 1000000:# 读取第100W行内容
            str = shlex.shlex(RowTest, posix=True)# 解析行内容数据,以逗号分割,不分割引号内容中的逗号
            str.whitespace = ','
            str.whitesapce_split = True
            ListTest = list(str)
            print(LineNumber, ListTest)
    End_Time = datetime.datetime.now()
    print("耗时:", End_Time - Start_Time)
    File_ID.close()

禁之零零 发表于 2019-8-21 23:30

幻象 发表于 2019-8-18 17:30
原理是Line_Byte这个变量只申请了一次,后面的数据对其覆盖,这样来节省内存的?

因为是一行一行的读取,不是一次性载入全部,读取了一行上一行的内存就被释放了

禁之零零 发表于 2019-8-18 11:24

mzussle 发表于 2019-8-17 23:44
换成excel试试

:lol一个Excel里面一张表只能存100W数据,现有的方法模块,都能解决啦

mzussle 发表于 2019-8-17 23:44

换成excel试试{:1_886:}

a87399 发表于 2019-8-18 00:08

对不起,是24行。

blueawter_cg 发表于 2019-8-18 00:18

用封装好的我一行代码就够了{:1_893:}

佚丶名 发表于 2019-8-18 07:41

谢谢可以来试试看

一人之下123456 发表于 2019-8-18 08:23

谢谢楼主,先备份收藏了,有需要的话会试试的。

幻象 发表于 2019-8-18 17:30

原理是Line_Byte这个变量只申请了一次,后面的数据对其覆盖,这样来节省内存的?

gavinfeng 发表于 2019-8-18 21:50

有现行的库。。。

禁之零零 发表于 2019-8-20 20:34

gavinfeng 发表于 2019-8-18 21:50
有现行的库。。。

啥库?当时在网上找了不行,csv库读不了数据太多的
页: [1] 2
查看完整版本: 【笔记】30行代码,低内存占用解读超大csv文件