Crossin的编程教室

标题: 【Python 第31课】 读文件 [打印本页]

作者: crossin先生    时间: 2014-4-24 18:36
标题: 【Python 第31课】 读文件
之前,我们写的程序绝大多数都依赖于从命令行输入。假如某个程序需要输入很多数据,比如一次考试的全班学生成绩,再这么输就略显痛苦了。一个常见的办法就是把学生的成绩都保存在一个文件中,然后让程序自己从这个文件里取数据。

要读取文件,先得有文件。我们新建个文件,就叫它data.txt。在里面随便写上一些话,保存。把这个文件放在接下来你打算保存代码的文件夹下,这么做是为了方便我们的程序找到它。准备工作就绪,可以来写我们的代码了。

打开一个文件的命令很简单:

file('文件名')

这里的文件名可以用文件的完整路径,也可以是相对路径。因为我们把要读取的文件和代码放在了同一个文件夹下,所以只需要写它的文件名就够了。

f = file('data.txt')

但这一步只是打开了一个文件,并没有得到其中的内容。变量f保存了这个文件,还需要去读取它的内容。你可以通过read()函数把文件内所有内容读进一个字符串中。

data = f.read()

做完对文件的操作之后,记得用close()关闭文件,释放资源。虽然现在这样一个很短的程序,不做这一步也不会影响运行结果。但养成好习惯,可以避免以后发生莫名的错误。

完整程序示例:

f = file('data.txt')
data = f.read()
print data
f.close()

是不是很简单?
0.jpeg

读取文件内容的方法还有

readline() #读取一行内容
readlines() #把内容按行读取至一个list中

去替换程序的第二行,看看它们的区别。


作者: 萧风    时间: 2014-7-1 14:05
QQ截图20140701140258.png
QQ截图20140701140437.png
这个分别是用readline()和readlines()方法读的文件,为什么readlinrs()读的中文是这样子的?



作者: crossin先生    时间: 2014-7-2 11:11
萧风 发表于 2014-7-1 14:05
这个分别是用readline()和readlines()方法读的文件,为什么readlinrs()读的中文是这样子的?

readlines是把整个文件按行读进一个list,每行是list中的一项
list在被直接print的时候不会对其中的字符进行解码
作者: 萧风    时间: 2014-7-2 12:29
crossin先生 发表于 2014-7-2 11:11
readlines是把整个文件按行读进一个list,每行是list中的一项
list在被直接print的时候不会对其中的字符 ...

那有解码的方式吗?
作者: crossin先生    时间: 2014-7-3 14:43
萧风 发表于 2014-7-2 12:29
那有解码的方式吗?

你用for循环把其中每一项拿出来单独print就可以了
作者: zzxomg    时间: 2015-3-14 13:49
  1. #coding:utf-8
  2. #文件操作
  3. f = file('data.txt')
  4. #con = f.read()
  5. #con = f.readline()
  6. con = f.readlines()
  7. for i in con :
  8.                 print i,
  9. f.close()
复制代码

作者: lovia    时间: 2015-5-28 00:13
正则表达式学完我感觉我就可以出自己的计算书了 hahahhha.png

作者: 460883323    时间: 2015-12-8 22:46
本帖最后由 460883323 于 2015-12-8 22:48 编辑

为啥我把上面代码复制到pyscripter里面,程序py文件和txt都是同个文件夹,总会提示:errno 2 no such file or directory

win10 x64,放到文件夹下面或者py文件和txt放到C盘根目录下都会报错
作者: 460883323    时间: 2015-12-9 12:12
460883323 发表于 2015-12-8 22:46
为啥我把上面代码复制到pyscripter里面,程序py文件和txt都是同个文件夹,总会提示:errno 2 no such file  ...

搞定了。。。原来是保存txt的时候,因为没有开启文件后缀名多写了个.txt上去。。。。问题已解决
作者: catherinemic    时间: 2016-1-2 15:39
  1. f=file('data.txt')

  2. data2=f.read()
  3. print data2

  4. data1=f.readline()
  5. print data1

  6. data3=f.readlines()
  7. for i in data3:
  8.     print i

  9. f.close()

  10. crossin老师,为什么这样写,最后输出的结果只有data2,而后面两个没有输出?
复制代码

Python16.png (4.12 KB, 下载次数: 441)

Python16.png


作者: crossin先生    时间: 2016-1-2 23:52
catherinemic 发表于 2016-1-2 15:39

文件被打开来,有个类似指针的东西,指向文件中的位置,read过一次之后,这个指针就指向文件末尾了,再读就读不出内容了。要重新打开文件,或者把指针重置到文件头f.seek(0)
作者: catherinemic    时间: 2016-1-3 11:37
crossin先生 发表于 2016-1-2 23:52
文件被打开来,有个类似指针的东西,指向文件中的位置,read过一次之后,这个指针就指向文件末尾了,再读 ...

明白了,谢谢crossin老师!
作者: 那夏日    时间: 2016-1-19 10:52
图挂了.....
作者: crossin先生    时间: 2016-1-19 20:55
那夏日 发表于 2016-1-19 10:52
图挂了.....

已修复

作者: 那夏日    时间: 2016-1-20 09:54
crossin先生 发表于 2016-1-19 20:55
已修复

哇 非常感谢
作者: mengnanlong    时间: 2016-4-11 15:32
Crossin老师,请问一下,怎么读取xls这类的表格文件啊?除了下载xlrd之外还要下什么模块吗?具体的语法我也不会,老师能不能教一下啊?谢谢~~
作者: crossin先生    时间: 2016-4-11 21:00
mengnanlong 发表于 2016-4-11 15:32
Crossin老师,请问一下,怎么读取xls这类的表格文件啊?除了下载xlrd之外还要下什么模块吗?具体的语法我也 ...

这个我没有做过,一般要做都是去搜下相关的文章,然后看对应的文档里,提供了哪些可用的函数。
以后会考虑挑一些模块来讲
作者: mengnanlong    时间: 2016-4-19 14:52
十分感谢,crossin老师
作者: 追风    时间: 2016-5-5 13:20
老师,文件的类型只能是txt吗?
作者: crossin先生    时间: 2016-5-6 10:54
追风 发表于 2016-5-5 13:20
老师,文件的类型只能是txt吗?

不是,不限制
作者: luolangsaint    时间: 2016-11-26 16:15
老师好,win10系统,Python 3.52,这个代码怎么报错呢。
f = file('data.txt')
data = f.read()
print (data)
f.close()

Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/python/file.py", line 1, in <module>
    f = file('data.txt')
NameError: name 'file' is not defined
作者: luolangsaint    时间: 2016-11-26 17:21
luolangsaint 发表于 2016-11-26 16:15
老师好,win10系统,Python 3.52,这个代码怎么报错呢。
f = file('data.txt')
data = f.read()

在一个同学的帮助下解决了,不用麻烦老师了,把file改为open 就可以了
作者: crossin先生    时间: 2016-11-26 18:07
luolangsaint 发表于 2016-11-26 17:21
在一个同学的帮助下解决了,不用麻烦老师了,把file改为open 就可以了


3里面已经没有file了
作者: l0ve1o24    时间: 2016-12-9 17:52
老师,readline(),提出来的是第一行,想提第二行应该怎么打,在括号里打2,好像是提出2个字符
作者: crossin先生    时间: 2016-12-9 22:29
l0ve1o24 发表于 2016-12-9 17:52
老师,readline(),提出来的是第一行,想提第二行应该怎么打,在括号里打2,好像是提出2个字符 ...

再执行一次 readline()
每执行一次,向后读一行
作者: l0ve1o24    时间: 2016-12-10 13:57
crossin先生 发表于 2016-12-9 22:29
再执行一次 readline()
每执行一次,向后读一行

原来如此
作者: sp627976612    时间: 2017-2-23 20:57
460883323 发表于 2015-12-9 12:12
搞定了。。。原来是保存txt的时候,因为没有开启文件后缀名多写了个.txt上去。。。。问题已解决 ...

你怎么解决的啊,我也遇到这个问题了,你的回复我没看懂.
作者: crossin先生    时间: 2017-2-24 16:55
sp627976612 发表于 2017-2-23 20:57
你怎么解决的啊,我也遇到这个问题了,你的回复我没看懂.

他的意思是,windows会隐藏后缀名。他起了个 data.txt ,实际是 data.txt.txt
解决方法就是自己不要加 txt
作者: surenck    时间: 2017-3-22 22:29
老师,为什么print 输出后会有一个空行,在print后加上,后就正常了。
作者: crossin先生    时间: 2017-3-23 17:32
surenck 发表于 2017-3-22 22:29
老师,为什么print 输出后会有一个空行,在print后加上,后就正常了。

对啊,py2就是这么设定的
作者: 枫叶落时    时间: 2017-8-10 21:53
有人可以为我讲解下这句话吗?data = f.read()
我不懂,为啥是f后面加.raed()基础打得不是很好,求解这句话,越详细越好~,谢谢
作者: crossin先生    时间: 2017-8-10 23:41
枫叶落时 发表于 2017-8-10 21:53
有人可以为我讲解下这句话吗?data = f.read()
我不懂,为啥是f后面加.raed()基础打得不是很好,求解这句 ...

read() 这是个函数,见19课。

f 是个打开的文件对象,f.read() 就是让这个文件去读取内容。
从理论上解释为什么这么写,见后面“面向对象”的内容
作者: crossin先生    时间: 2017-8-10 23:42
枫叶落时 发表于 2017-8-10 21:53
有人可以为我讲解下这句话吗?data = f.read()
我不懂,为啥是f后面加.raed()基础打得不是很好,求解这句 ...

从你今天提的几个问题来看,我建议你不要求快囫囵吞枣,先回头把前面几课的代码自己打出来运行,慢慢理解透彻
作者: 枫叶落时    时间: 2017-8-10 23:47
好的好的,我会回头再看的。重新过一遍题
作者: haoxunzhao    时间: 2017-10-19 08:24
catherinemic 发表于 2016-1-2 15:39

我的也是呀,为什么
作者: woodumpling    时间: 2017-10-19 09:39
haoxunzhao 发表于 2017-10-19 08:24
我的也是呀,为什么

请问是什么问题?
作者: crossin先生    时间: 2017-10-19 20:57
catherinemic 发表于 2016-1-2 15:39

文件有读取位置的,你可以想象成文件里的光标
读完一次到底之后就结束了
要重新读用 seek(0)
作者: 努力的小白    时间: 2017-10-21 22:09
本帖最后由 努力的小白 于 2017-10-21 22:12 编辑

python3和2有好多不同,很多的莫名其妙的,老师有空能出一章详细说明2和3的指令和用法不同吗?
作者: crossin先生    时间: 2017-10-21 23:50
努力的小白 发表于 2017-10-21 22:09
python3和2有好多不同,很多的莫名其妙的,老师有空能出一章详细说明2和3的指令和用法不同吗? ...

写过的,公众号里回复 2v3
作者: lubvi    时间: 2017-10-30 10:55
f = file('data.txt')
data = f.read()
print(data)
f.close()

为啥报错呢C:\Users\wangc\Desktop\微信截图_20171030105303.png

微信截图_20171030105303.png (22.6 KB, 下载次数: 263)

微信截图_20171030105303.png


作者: crossin先生    时间: 2017-10-30 11:14
lubvi 发表于 2017-10-30 10:55
f = file('data.txt')
data = f.read()
print(data)

改用 open
作者: crossin先生    时间: 2017-10-30 11:14
lubvi 发表于 2017-10-30 10:55
f = file('data.txt')
data = f.read()
print(data)

py3没有file,改open了
作者: lubvi    时间: 2017-10-30 11:22
crossin先生 发表于 2017-10-30 11:14
py3没有file,改open了

谢谢C老师,刚才也在上面的回复里找到了。   Py3留了好多坑啊
作者: Imagination    时间: 2017-12-3 15:51
file 可以用在python3上吗  为什么我在python3上运行不成功 显示file没有被定义
作者: braid    时间: 2017-12-4 09:27
Imagination 发表于 2017-12-3 15:51
file 可以用在python3上吗  为什么我在python3上运行不成功 显示file没有被定义

file在python3中取消了,你可以使用open()替代
作者: yamika    时间: 2018-3-9 15:34
py3里的是不是没有file这一指令?字体颜色都是黑色
作者: crossin先生    时间: 2018-3-9 18:39
yamika 发表于 2018-3-9 15:34
py3里的是不是没有file这一指令?字体颜色都是黑色

改open了
作者: yamika    时间: 2018-3-9 21:38
crossin先生 发表于 2018-3-9 18:39
改open了

非常感谢楼主回复,看到32课时,也猜想应该用open了。
也感谢楼主的课程分享,很受用,学起来比直接的教程有趣,希望编程教室越办越好!
作者: crossin先生    时间: 2018-3-10 15:00
yamika 发表于 2018-3-9 21:38
非常感谢楼主回复,看到32课时,也猜想应该用open了。
也感谢楼主的课程分享,很受用,学起来比直接的教 ...

谢谢支持
作者: 司南    时间: 2018-4-9 17:10
课堂作业
  1. #读取文件
  2. #司南 2018.04.09
  3. f=open('class.txt')
  4. data=f.read()
  5. print(data)
  6. f.seek(0)
  7. data1=f.readline()
  8. print(data1)
  9. f.close
  10. f=open('class.txt')
  11. data2=f.readlines()
  12. print(data2)
  13. f.close()
复制代码

作者: 落梦    时间: 2019-11-29 00:30
找不到路径!!!!!
f = open('a.txt')
data = f.read()
print(data)
f.close()
----------------------------------------------------------------------------------------------------------------------------------
"C:\Program Files\Python38\python.exe" C:\Users\23593\Desktop\.idea\python练习\读文件.py
Traceback (most recent call last):
  File "C:\Users\23593\Desktop\.idea\python练习\读文件.py", line 1, in <module>
    f = open('a.txt')
FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'
作者: crossin先生    时间: 2019-11-29 12:20
落梦 发表于 2019-11-29 00:30
找不到路径!!!!!
f = open('a.txt')
data = f.read()

说明你文件名或者放的位置不对,翻下这个帖子之前的回帖,对你会有参考




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5