当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 6 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 关于文件Python中文件读取
帖子发表于 : 2011-03-30 22:44 
头像

注册: 2008-12-30 20:38
帖子: 67
送出感谢: 0 次
接收感谢: 0 次
在《Python核心编程》中有一段这样的代码:
代码:
filename = raw_input('enter your name')
fobj = open(filename, 'r')
for eachlin in fobj:
    print eachline,
fobj.close()


然后后面的解释说:
引用:
我们的代码没有一次循环一次取一行显示,而是做了点改变。我们一次读入文件的所有行,然后关闭文件,再迭代每一行输。

我觉得这样的说法是不对的,但是初次接触python,不知道到底是怎么一回事。所以还要请各位前辈们指点一下。
先谢谢各位了


_________________
为学日益,为道日损


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 关于文件Python中文件读取
帖子发表于 : 2011-04-01 7:34 
头像

注册: 2008-08-28 8:12
帖子: 288
送出感谢: 0 次
接收感谢: 1
具体的过程我也不是很清楚,但是按照解释的思路走,过程是这样的:

fobj = open() 就已经把所有的文件内容全部读取到了fobj里面去了。

后面的for eachLine in fobj么,fobj的核心数据应该是一个存储了文件内容的每一行的列表,in这个关键字可以在一个列表中进行遍历。文件是否关闭了我不是很清楚,但是至少知道,在open之后,所有的文件内容应该是已经到fobj里面去了(顺着解释的思路走的,具体是不是还需要再进行考证)。


_________________
SLAX and Xorg(without any Window Managers)
It's fun!


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 关于文件Python中文件读取
帖子发表于 : 2011-04-02 19:21 

注册: 2011-03-27 13:44
帖子: 10
送出感谢: 0 次
接收感谢: 0 次
终端打开python
查看python的内存占用 3.0m
输入a = open("/home/xxx/10m.bin","r")
查看python的内存占用 3.0m
输入a.readline(1)
查看python的内存占用 3.0m
输入a.read()
查看python的内存占用 13.0m
上例只有在read()时才会把文件的所有内容读入内存
楼主的例子是在for的时候会逐行读取文件
最终把所有内容读到输出中
再关闭文件
open只是打开文件不会做其他事


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 关于文件Python中文件读取
帖子发表于 : 2011-04-02 20:26 
头像

注册: 2009-01-06 15:18
帖子: 13005
地址: 人间
送出感谢: 1
接收感谢: 24
引用:
先读出文件的所有行,然后关闭文件,再迭代每一行输


不很理解。
文件关闭了。
对文件的读取操作得到的东西扔哪去了。
要如何再迭代输入呢?

引用:
楼主的例子是在for的时候会逐行读取文件
最终把所有内容读到输出中
再关闭文件


这顺序同例子中的不相符啊。




正在看这书。欢迎共同探讨。


_________________
“有一种被人抛诸脑后的过去,包含一些不该遗忘的点点滴滴。欢笑之余,我将故旧拾起,才刹见自己的薄情。人世间似乎存在着某种公平,每个人都曾被抛掷在他人的遗忘中;而今你所有哽咽难宣的话语,也正是你曾为人所期盼,却永远听不见的字句。” —赫曼 赫塞


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 关于文件Python中文件读取
帖子发表于 : 2011-04-03 1:56 

注册: 2011-03-27 13:44
帖子: 10
送出感谢: 0 次
接收感谢: 0 次
fobj的类型是file不是列表
file的for是特殊的

创建一个每一行1m共10m的文件
write.py
代码:
import os
os.system("dd if=/dev/zero of=1m.bin bs=1M count=1")
f = open('1m.bin','r')
m = f.read()
f.close()
n = ''
for i in range(0,10):
   n += m + '\n'
f = open('10m.bin','w')
f.write(n)
f.close()


读取它
read.py
代码:
import gc
import sys
import time
filename = '10m.bin'
fobj = open(filename, 'r')
print type(fobj)
print "start",
raw_input()
for eachline in fobj:
   print "continue",
   raw_input()
   pass
print "close",
raw_input()
fobj.close()
print "quit",
raw_input()

用法:每enter一次就查看一次python的内存占用并记录。
结果
引用:
2.6

4.7
4.9
4.9
4.9
6.9
5.1
5.9
5.9
5.9
5.9

5.9

结论:
内存占用是在for开始后才增加的(从2.6到4.7),
但读取时会有缓存与释放,
文件关闭后并不会释放内存占用。

print的情况下就不清楚了,打印1m的数据很费时间。


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 关于文件Python中文件读取
帖子发表于 : 2011-04-03 7:15 
头像

注册: 2008-08-28 8:12
帖子: 288
送出感谢: 0 次
接收感谢: 1
哇!!LS的实验好棒!!!受教了……


_________________
SLAX and Xorg(without any Window Managers)
It's fun!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 6 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译