关于文件Python中文件读取

Python/PHP/Perl 开发与设计
回复
头像
maxyang2008
帖子: 67
注册时间: 2008-12-30 20:38
送出感谢: 0
接收感谢: 0

关于文件Python中文件读取

#1

帖子 maxyang2008 » 2011-03-30 22:44

在《Python核心编程》中有一段这样的代码:

代码: 全选

filename = raw_input('enter your name')
fobj = open(filename, 'r')
for eachlin in fobj:
    print eachline,
fobj.close()
然后后面的解释说:
我们的代码没有一次循环一次取一行显示,而是做了点改变。我们一次读入文件的所有行,然后关闭文件,再迭代每一行输。
我觉得这样的说法是不对的,但是初次接触python,不知道到底是怎么一回事。所以还要请各位前辈们指点一下。
先谢谢各位了
为学日益,为道日损
头像
racnil
帖子: 288
注册时间: 2008-08-28 8:12
送出感谢: 0
接收感谢: 0
联系:

Re: 关于文件Python中文件读取

#2

帖子 racnil » 2011-04-01 7:34

具体的过程我也不是很清楚,但是按照解释的思路走,过程是这样的:

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

后面的for eachLine in fobj么,fobj的核心数据应该是一个存储了文件内容的每一行的列表,in这个关键字可以在一个列表中进行遍历。文件是否关闭了我不是很清楚,但是至少知道,在open之后,所有的文件内容应该是已经到fobj里面去了(顺着解释的思路走的,具体是不是还需要再进行考证)。
SLAX and Xorg(without any Window Managers)
It's fun!
一匹草泥马
帖子: 10
注册时间: 2011-03-27 13:44
送出感谢: 0
接收感谢: 0

Re: 关于文件Python中文件读取

#3

帖子 一匹草泥马 » 2011-04-02 19:21

终端打开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只是打开文件不会做其他事
头像
remeber
论坛版主
帖子: 13005
注册时间: 2009-01-06 15:18
来自: 人间
送出感谢: 1 次
接收感谢: 22 次

Re: 关于文件Python中文件读取

#4

帖子 remeber » 2011-04-02 20:26

先读出文件的所有行,然后关闭文件,再迭代每一行输
不很理解。
文件关闭了。
对文件的读取操作得到的东西扔哪去了。
要如何再迭代输入呢?
楼主的例子是在for的时候会逐行读取文件
最终把所有内容读到输出中
再关闭文件
这顺序同例子中的不相符啊。




正在看这书。欢迎共同探讨。
“有一种被人抛诸脑后的过去,包含一些不该遗忘的点点滴滴。欢笑之余,我将故旧拾起,才刹见自己的薄情。人世间似乎存在着某种公平,每个人都曾被抛掷在他人的遗忘中;而今你所有哽咽难宣的话语,也正是你曾为人所期盼,却永远听不见的字句。” —赫曼 赫塞
一匹草泥马
帖子: 10
注册时间: 2011-03-27 13:44
送出感谢: 0
接收感谢: 0

Re: 关于文件Python中文件读取

#5

帖子 一匹草泥马 » 2011-04-03 1:56

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的数据很费时间。
头像
racnil
帖子: 288
注册时间: 2008-08-28 8:12
送出感谢: 0
接收感谢: 0
联系:

Re: 关于文件Python中文件读取

#6

帖子 racnil » 2011-04-03 7:15

哇!!LS的实验好棒!!!受教了……
SLAX and Xorg(without any Window Managers)
It's fun!
回复

回到 “Python/Php/Perl”