免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8653 | 回复: 21
打印 上一主题 下一主题

文件读写请教,readline,writelines [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-27 10:20 |只看该作者 |倒序浏览
本帖最后由 bleem1998 于 2012-08-27 10:56 编辑

test.py

  1. fpath = 'abc.txt'
  2. fin = open(fpath,'r+')
  3. result = fin.readline()
  4. print result
  5. fin.writelines(['111'])
  6. fin.close()
复制代码
abc.txt

  1. abc
  2. abc
  3. abc
  4. abc
复制代码
为什么会写不进去呢?
readlin和writelies不能混用吗?
操作系统是windows XP
python2.5.4

论坛徽章:
0
2 [报告]
发表于 2012-08-27 15:01 |只看该作者
#!/usr/bin/env python
import os

fileread = open('abc.txt', 'r')
filewrite = open('111.txt', 'w')

allLines = fileread.readlines()
for lines in allLines:
    filewrite.write(lines)
filewrite.close()
fileread.close()

论坛徽章:
0
3 [报告]
发表于 2012-08-27 15:04 |只看该作者
操作同一个文件呢
先读一行
然后修改一行
当然每行的长度是固定一样的

论坛徽章:
2
IT运维版块每日发帖之星
日期:2015-09-07 06:20:00IT运维版块每日发帖之星
日期:2015-09-07 06:20:00
4 [报告]
发表于 2012-08-27 15:09 |只看该作者
回复 3# bleem1998
貌似只要是流模式读写文件,都不能边读边写的吧
   

论坛徽章:
0
5 [报告]
发表于 2012-08-27 15:13 |只看该作者
不明白你的意思,同一文件读一行,修改一行? 如果是你想把一个文件的内容copy到另外一文件,这里需要的是两个文件对象

论坛徽章:
0
6 [报告]
发表于 2012-08-27 15:14 |只看该作者
这个解释很独到啊

论坛徽章:
0
7 [报告]
发表于 2012-08-27 15:35 |只看该作者
回复 5# hushan1985


   
比如有个文件是下面这样的
我要把所有'小红'下面的数字都改为00
所以我读一行判断是不是小红
然后再写一行

  1. 小明
  2. 80
  3. 小红
  4. 60
  5. 小白
  6. 30
  7. 小红
  8. 90
  9. 小王
  10. 30
  11. 小红
  12. 80
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-09-17 13:36 |只看该作者
file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:

     * file(name[, mode[, buffering]])

file()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。
mode 是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清 空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如 在 unix中是一个\n,而在windows中是‘\r\n’,用U模式打开文件,就是支持所有的换行模式,也就说‘\r’ ‘\n’ ‘\r\n’都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式 字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。

喜欢PYTHON的简洁,我也有自翻译相关文章,请多多指导:http://www.yiibai.com/python
相互学习,共同进步。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
9 [报告]
发表于 2012-09-17 16:03 |只看该作者
读写自古不能连续操作, 这是C语言基础功.

请在read和write之间加一句fseek, 以便清理掉缓冲区.

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
10 [报告]
发表于 2012-09-17 16:15 |只看该作者
  1. #python3.2
  2. #coding=utf8

  3. #xxx's content is:
  4. #abc
  5. #abc

  6. import os

  7. stream = open('xxx', 'r+')
  8. print(stream.readline())
  9. #stream.seek(0, os.SEEK_CUR)
  10. stream.write('111\n')
  11. stream.close()
复制代码
自己跑这个代码, 先跑带注释的, 再跑没注释的.

文件xxx最初是:
abc
abc

第一次跑, 你发现111写在第三行, 结果是:
abc
abc
111

你应该知道为什么了, 因为readline -> fgets, 而FILE默认是全缓冲的, 所以会预读一些字节并只返回一行, 这里调用一次readline其实已将整个文件读入了缓冲, 并返回了第一行abc.  紧接着write, 因为C标准IO里的FILE结构体, 读写共享同一个缓冲区, 所以你接着写实际是将111追加到缓冲区, 此时缓冲区里是abc\n111\n, stream.close时将缓冲区里的字节全部dump到磁盘, 所以你看到abc\nabc\n111\n.

为什么加fseek就好了? 因为这个函数会刷新缓冲区, 所以write不会受到read缓冲的影响.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP