当前位置:   article > 正文

python3关于写入csv档效率问题_python 写入csv文件的速度

python 写入csv文件的速度

前几天做的一个处理csv档的程序放在了服务器上跑,结果发现时间很久,处理一个113M差不多70W行的csv档需要65s左右,然后对其中的各部分操作分别计时,发现大部分时间都是花费存取csv档上足足要53s左右,而处理一列数据也仅需3s。然后今天就开始找提高存储效率的方法了!

首先说结论,使用csv模块的writerows方法最后是成功的提高了效率,不过还是很想通过pickle方法来实现,其中乱码跟排版的问题弄的头大,,希望有大佬知道的能指点一下啊!

一、data.to_csv()

首先是浪费了55s的to_csv方法,去网上看了下,这个方法在处理小批量的数据时还是速度很快的,但是数据量越大速度就呈线性下降了,然后首先想到的是会不会因为数据都先在内存里,然后再存到文件中,这样效率是慢,然后想到边读边存,先把数据放在列表中,然后再存入文件中,不过试了下效率不高,而且内容分开了,对不起,我是菜鸡,代码删除了,就不贴了。(┬_┬)

二、pickle

python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

基本接口:

pickle.dump(obj, file, [,protocol])
注解:将对象obj保存到文件file中去。
  protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示;1:老式的二进制协议;2:2.3版本引入的新二进制协议,较以前的更高效。其中协议0和1兼容老版本的python。protocol默认值为0。
  file:对象保存到的类文件对象。file必须有write()接口, file可以是一个以'w'方式打开的文件或者一个StringIO对象或者其他任何实现write()接口的对象。如果protocol>=1,文件对象需要是二进制模式打开的。

pickle.load(file)
  注解:从file中读取一个字符串,并将它重构为原来的python对象。
  file:类文件对象,有read()和readline()接口。

  1. import pickle
  2. #这一段是搬别人的。懒得贴自己的了,因为我没成功,代码删除了!hh~
  3. data1 = {'a': [1, 2.0, 3, 4+6j],
  4. 'b': ('string', u'Unicode string'),
  5. 'c': None}
  6. selfref_list = [1, 2, 3]
  7. selfref_list.append(selfref_list)
  8. with open('data.csv','wb') as f: #这里一定要用b方式打开,不然会报错,因为只能处理二进制
  9. # Pickle dictionary using protocol 0.
  10. pickle.dump(data1, f)
  11. # Pickle the list using the highest protocol available.
  12. pickle.dump(selfref_list, f, -1)

首先这个方法用二进制进行存储,效率是肯定的,只要5s时间,但是因为打开文件是乱码,所以我放弃了,在网上有看到是把第三个参数设置为0,也就是ASCII编码就可以了,但是我还是不行,然后想了下是不是因为我输入的对象是dataframe(我是用pandas处理数据)然后把dataframe对象转成字典也还是乱码,转成列表也是乱码,然后在网上找到用pickle能转换成python能识别的,最好是用在有大数据先读取,然后用dumps保存在变量中,等需要时再通过loads读取,就很快捷,然后我就放弃这个方法了。

三、writerows

最后想到的是csv模块的方法,将dataframe对象转换成列表,再使用writerows方法写入文件,发现效率还行,15s时间,算是马马虎虎满足了需求。

  1. import pandas as pd
  2. import numpy as np
  3. import csv
  4. dataframe = pd.read_csv(csv_dir+csv_name1, sep=',',header=56,usecols=[i for i in range(111)]) #获取dataframe数据
  5. train_data = np.array(body) #先转成np数据
  6. abb = train_data.tolist() #再转成list
  7. with open(local_csv_path+csv_name1,'a',newline='') as f:
  8. writer = csv.writer(f)
  9. writer.writerows(abb)

抽取了核心代码出来,不过总觉得还是能改进,今天花了五六个小时就在这个问题上了。。另外,在服务器上读取本地的json档不知道为什么要5s多,而本机读取json就忽略不计的时间。。这个晚上回去再看看~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/72420
推荐阅读
相关标签
  

闽ICP备14008679号