鱼C论坛

 找回密码
 立即注册
查看: 2197|回复: 11

[已解决]为什么python 对文件 read() 一定字符个数,文件指针就到了末尾?

[复制链接]
发表于 2021-3-6 17:11:05 | 显示全部楼层 |阅读模式

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

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

x
如题,我打开一个文本文件  read(6)  6个字符,tell一下文件指针没有指向尾部,但是write()了几个字符全部输出在了文件的尾部
我只用文本模式读了6个字符,怎么可能就到了文件末尾,而且tell()显示是16个字节刚好是5个汉字,1个字母a,文本文件的原来内容是:我是个好人abcdefg
怎么回事,大家帮帮我
最佳答案
2021-3-6 22:20:40
chinesestcx 发表于 2021-3-6 20:51
老哥,为什么r+模式一开始(前面对文件没有操作)在开头写入呢?

这就不清楚了,机制比较迷。猜测:没读过的文件,从当前位置写入,读过的文件(包括seek后又读取),为防止无意中覆盖,从末尾写入。另外由于缓冲的原因,file_obj.write()后要及时用file_obj.flush()刷新缓冲,否则涉及多次读写的情况下,就算file_obj.seek(0, 1)也有可能出现全部写入到末尾的情况。
0W][9``2W4IPZ@}7C)K@QHE.png
246@UV]7SK)]$5PA[B7)N%I.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-6 18:10:40 From FishC Mobile | 显示全部楼层
写文件只能是尾部写入,难不成你还指望着在中间写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-6 18:13:53 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2021-3-6 18:24 编辑

r+模式打开文件,写入时默认从结尾写入,除非主动移动指针
with open('demo.txt', 'r+', encoding='utf-8') as file_obj:
    print('读取内容:', file_obj.read(6))
    print('读取后指针位置:', file_obj.tell())
    # ↓主动将指针移到当前位置(即为上面的16),尽管指针位置没变,但写入的结果却不一样
    print('移动后指针位置:', file_obj.seek(0, 1))
    # print('移动后指针位置:', file_obj.tell()) # 这句跟上面结果是一样的
    print('写入字符数:', file_obj.write('hello'))
    print('写入后指针位置:', file_obj.tell())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-3-6 18:16:17 | 显示全部楼层
https://blog.csdn.net/jusulysunbeamy/article/details/51290129
没找到办法,似乎查到的就这种拼接重写的好像可以达到目的
按照这个稍微修改下应该可以实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-6 18:16:50 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-6 18:59:57 | 显示全部楼层
      UTF-8 编码每个西文字符占用 1 个字节,每个汉字占用 3 个字节,在本例中,语句 file_obj . read(6) 读取的 6 个字符中,前 5 个是汉字,第 6 个是西文字符,每个汉字占用 3 个字节,就是 15 个字节,加 1 个字节的西文字符恰好就是 16 字节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-6 20:51:25 | 显示全部楼层
hrp 发表于 2021-3-6 18:13
r+模式打开文件,写入时默认从结尾写入,除非主动移动指针

老哥,为什么r+模式一开始(前面对文件没有操作)在开头写入呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-6 20:56:18 | 显示全部楼层
wp231957 发表于 2021-3-6 18:10
写文件只能是尾部写入,难不成你还指望着在中间写入

不是啊,r+模式一开始在开头写入啊
[img]C:\Users\86151\Desktop\R}3L(O__C8MH`5A4J%%4@N7.png[/img]
C:\Users\86151\Desktop\}UY8PI8K@{PTC$YN~US5({M.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-6 20:57:24 | 显示全部楼层
真的很感谢大家,努力帮我解决问题,困扰我一下午了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-6 20:59:08 | 显示全部楼层
jackz007 发表于 2021-3-6 18:59
UTF-8 编码每个西文字符占用 1 个字节,每个汉字占用 3 个字节,在本例中,语句 file_obj . read(6)  ...

是的,那它接下来写字符应当在b的位置写,可是write()函数的内容写到了最后面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-6 22:20:40 | 显示全部楼层    本楼为最佳答案   
chinesestcx 发表于 2021-3-6 20:51
老哥,为什么r+模式一开始(前面对文件没有操作)在开头写入呢?

这就不清楚了,机制比较迷。猜测:没读过的文件,从当前位置写入,读过的文件(包括seek后又读取),为防止无意中覆盖,从末尾写入。另外由于缓冲的原因,file_obj.write()后要及时用file_obj.flush()刷新缓冲,否则涉及多次读写的情况下,就算file_obj.seek(0, 1)也有可能出现全部写入到末尾的情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-6 22:26:45 | 显示全部楼层
hrp 发表于 2021-3-6 22:20
这就不清楚了,机制比较迷。猜测:没读过的文件,从当前位置写入,读过的文件(包括seek后又读取),为防止 ...

我刚刚和我老师讨论差不多也是这个结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 09:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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