鱼C论坛

 找回密码
 立即注册
查看: 902|回复: 18

python的文件打开疑问

[复制链接]
发表于 2019-6-6 18:08:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
手头一个csv文件,略有些大,几十M这样。。用惯了pandas的打开方式,data = pd.read_csv(文件)。。data就是dataframe格式,查看起来很方便。
但是打开速度,感觉略有些慢。。。
不知道用python 的with open语句,是否可以更快些? 同时,with open语句打开文件的话,文件是什么格式,又该如何查看呢?
常规都是with open (文件,‘r’) as f:
f.readline()  # 一行行阅读。。
此时的f是什么格式,如果要转成dataframe的话,是否也挺浪费时间的?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-6 18:11:10 | 显示全部楼层
csv 文档就是一个纯文本文档,如何打开 关键看你干嘛了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-6 18:14:56 | 显示全部楼层
本帖最后由 老笨啊 于 2019-6-6 18:19 编辑
wp231957 发表于 2019-6-6 18:11
csv 文档就是一个纯文本文档,如何打开 关键看你干嘛了


我就是想试下多种方式打开,看下效果。。
pandas打开的话,比较方便些,数据观察起来就是数据框的格式。。
如果用with open语句,貌似还是多一步转换? 要不然看起来很不方便?
另外,用with open语句打开文件的话,是否就是像我那样,直接f.readline?
刚才试了下,还要用print语句,如果文件过大,还不能用readlines。。
那一行行怎么看。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-6 18:26:20 From FishC Mobile | 显示全部楼层
老笨啊 发表于 2019-6-6 18:14
我就是想试下多种方式打开,看下效果。。
pandas打开的话,比较方便些,数据观察起来就是数据框的格式 ...

手头没有大文本,要不你发一个??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-6 18:35:48 | 显示全部楼层
wp231957 发表于 2019-6-6 18:26
手头没有大文本,要不你发一个??

几十兆的,没法上传啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-6 18:38:16 From FishC Mobile | 显示全部楼层
老笨啊 发表于 2019-6-6 18:35
几十兆的,没法上传啊

嗯,一会我自己做一个
p s,没有百度网盘吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-6 18:42:49 | 显示全部楼层
wp231957 发表于 2019-6-6 18:38
嗯,一会我自己做一个
p s,没有百度网盘吗

数据不好提供,涉密
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-6 18:48:52 | 显示全部楼层
wp231957 发表于 2019-6-6 18:38
嗯,一会我自己做一个
p s,没有百度网盘吗

我的想法是,先用with open命令打开文件,同时也转换成dataframe格式。
这样的话,会不会速度比pandas直接打开文件,来得快?
因为目前是遇到几十兆的文件,pandas打开耗时一两秒的时间。。如果文件再大些,我都担心耗时过久。。甚至存在打不开的情况。。如果用with open命令打开的话,也许可以解决大文件的打开问题。
但是水平有限,不知道这个语句该怎么写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-6 19:16:40 | 显示全部楼层
老笨啊 发表于 2019-6-6 18:48
我的想法是,先用with open命令打开文件,同时也转换成dataframe格式。
这样的话,会不会速度比pandas直 ...

第一,你不用考虑太大打不开怎么办(此时你应该考虑更换思路,比如固定文本长度,超过xxx时 要进行xxx处理)
2: 我觉得文本达到G这个级别了,一般都够呛了
3.不要纠结与pandas的速度了,已经很快了,还想怎样?
看实例: 我自己做了一个70M的文本,用windows自带的type 显示完毕 耗时7分30秒左右
              使用python自带的  open().read()  大概耗时3分钟左右
              使用data = pd.read_csv("wp16.csv")  大约是秒级,你还想咋快呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-6 19:20:23 | 显示全部楼层
wp231957 发表于 2019-6-6 19:16
第一,你不用考虑太大打不开怎么办(此时你应该考虑更换思路,比如固定文本长度,超过xxx时 要进行xxx处 ...

当然了,它这个秒级只是读到内存  而前两个 是显示到屏幕  但即使这样,他们也不在一个级别上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-6 19:27:35 | 显示全部楼层
wp231957 发表于 2019-6-6 19:20
当然了,它这个秒级只是读到内存  而前两个 是显示到屏幕  但即使这样,他们也不在一个级别上

不是吧。。。我自己刚才测试了下时间。。只是40多M的csv文件,pandas打开是6.6秒。。
如果用with open 命令打开的话(分隔符设置成逗号),是3秒内打开完毕。。时间比pandas打开快啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-6 19:29:12 | 显示全部楼层
老笨啊 发表于 2019-6-6 19:27
不是吧。。。我自己刚才测试了下时间。。只是40多M的csv文件,pandas打开是6.6秒。。
如果用with open  ...

代码?  我是在shell环境下测试的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-6 19:31:08 | 显示全部楼层
老笨啊 发表于 2019-6-6 19:27
不是吧。。。我自己刚才测试了下时间。。只是40多M的csv文件,pandas打开是6.6秒。。
如果用with open  ...

[3178120 rows x 6 columns]

可能我设计这个文本 行数太多了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-6 19:32:16 | 显示全部楼层
wp231957 发表于 2019-6-6 19:29
代码?  我是在shell环境下测试的
  1. t3 =time.time()
  2. res = []
  3. with open(r"file",'r') as f:
  4.     while True:
  5.         line = f.readline()
  6.         if not line:
  7.             break
  8.         res.append(line.split(','))
  9. data1 = pd.DataFrame(res)
  10. t4 =time.time()
  11. print(t4-t3)
  12. data1.head()
复制代码


这个是别人教的。。
我在jupyter编辑器里做的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-6 19:43:37 | 显示全部楼层
老笨啊 发表于 2019-6-6 19:32
这个是别人教的。。
我在jupyter编辑器里做的

不加屏显 还是很快的 8秒多一些
加上屏显就很蜗牛了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-6 19:48:42 | 显示全部楼层
老笨啊 发表于 2019-6-6 19:32
这个是别人教的。。
我在jupyter编辑器里做的

二进制读取快啊  可是不能屏显:
  1. import time

  2. t3 =time.time()
  3. f= open(r"e:\\wp16.csv",'rb')
  4. f.read()
  5. t4 =time.time()
  6. print(t4-t3)
复制代码

e:\>python ex4.py
0.07680034637451172

e:\>python ex4.py
0.07800006866455078

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-7 06:11:29 | 显示全部楼层
wp231957 发表于 2019-6-6 19:48
二进制读取快啊  可是不能屏显:

e:\>python ex4.py

调试过程,需要屏显。。。后期可以不要。。关键是还是数据处理。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-8 08:06:59 | 显示全部楼层
iwanna 发表于 2019-6-7 18:23
自己构建struct,写入二进制文件
不过估计也快不到哪里,pandas本身就是优化过的.你觉得开发人员没考虑这些 ...

可是事实是,我试了下,的确时间会快些啊。。
难道哪里有问题么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-16 06:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表