鱼C论坛

 找回密码
 立即注册
查看: 749|回复: 6

[已解决]求助一下文档的写入问题

[复制链接]
发表于 2019-3-30 22:18:27 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 kklnkklnkkln 于 2019-3-31 00:42 编辑
def file_replace(file_name,rep_word,new_word):
    f_read = open(file_name)

    content = []
    conut = 0

    for eachline in f_read:
        if rep_word in eachline:
            count += eachline.count(rep_word)
            eachline = eachline.replace(rep_word,new_word)
        content.append(eachline)


    decide = input('\n文件 %s 中共有%s个【%s】\n您确定要把所有的【%s】替换为【%s】吗?\n【YES/NO】:' \
                   % (file_name, count, rep_word, rep_word, new_word))


    if decide in ['YES','Yes','yes']:
        f_write = open(file_name,'w')
        f_write.writelines(content)
        f_write.close()


    f_read.close()


file_name = input('请输入文件名:')
rep_word = input('请输入要替换的单词或者字符:')
new_word = input('请输入新的单词或者字符:')

file_replace(file_name,rep_word,new_word)


f_write.writelines(content)为什么这一行代码能精准的替代原有的位置?
content只是储存了 新的替换文字啊,还是说储存的时候已经把原有的位置也记住了?新的写入直接写入原有的位置?
最佳答案
2019-3-31 21:27:23
'w'有新的东西往里写才会覆盖,不写就不覆盖。
f_write = open(file_name,'w')

writelines的时候没有替换工作,替换工作在eachline.replace(rep_word,new_word)已经完成了。

写入文件的语句是这个:
f_write.writelines(content)
content是你写入到文件的内容,这个content的构建是在前面那个for循环里面完成的。

看前面那个for循环,是把每一句话都放到contnet里面了,最后写入文件的时候也是按顺序写进去就完事了,不涉及「自动找到替换前的位置」
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-31 00:41:37 | 显示全部楼层
f_write = open(file_name,'w')  

文本中w的打开方式是  覆盖原有内容
写入的也只是content的列表,为什么内容只有修改的文字变了,而整体文字没有被覆盖?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-31 02:15:13 | 显示全部楼层
看前面for循环这块,他是把替换后的每句话,挨个放到了content中,所以content中里面存的是替换了字符串后的所有文本内容。
    for eachline in f_read:
        if rep_word in eachline:
            count += eachline.count(rep_word)
            eachline = eachline.replace(rep_word,new_word)
        content.append(eachline)

再看下面这段,你输入yes之后,它会把content中的内容(已经替换了对应的字符串)写入到文件中,
如果不是yes,就不修改原文档
if decide in ['YES','Yes','yes']:
        f_write = open(file_name,'w')
        f_write.writelines(content)
        f_write.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-31 12:48:45 | 显示全部楼层
shuofxz 发表于 2019-3-31 02:15
看前面for循环这块,他是把替换后的每句话,挨个放到了content中,所以content中里面存的是替换了字符串后 ...
 eachline = eachline.replace(rep_word,new_word)


这一行代码是把新的字符替换了 旧的字符,
用writelines 写入的时候 会自动找到替换前的位置,然后把新的写入到原有的位置吗?
主要是没弄懂,是怎么只替换原有字符串,而不改变其他的字符,
用‘w’ 的 方式写入 我记得是要覆盖原来所有有内容啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-31 21:27:23 | 显示全部楼层    本楼为最佳答案   
'w'有新的东西往里写才会覆盖,不写就不覆盖。
f_write = open(file_name,'w')

writelines的时候没有替换工作,替换工作在eachline.replace(rep_word,new_word)已经完成了。

写入文件的语句是这个:
f_write.writelines(content)
content是你写入到文件的内容,这个content的构建是在前面那个for循环里面完成的。

看前面那个for循环,是把每一句话都放到contnet里面了,最后写入文件的时候也是按顺序写进去就完事了,不涉及「自动找到替换前的位置」
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-1 00:38:37 | 显示全部楼层
shuofxz 发表于 2019-3-31 21:27
'w'有新的东西往里写才会覆盖,不写就不覆盖。

大佬,最后问一个问题
 eachline = eachline.replace(rep_word,new_word)
这行代码是,修改完单条语句后,然后再放到列表里面的,是已经替换成功的语句,

但是没有被修改的语句是没有被加入到content列表里面的

第一次是只读模式打开,把修改完后的语句添加到列表,

第二次是写入模式打开,相当于文件里面还是原有的内容没有变,是如何替换掉的

在原有的TXT文档里面,用‘‘w’方式写入新的,为什么没有覆盖没有修改的语句,而只替换了修改过的语句
主要是这里没弄懂,





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-1 09:31:23 | 显示全部楼层
本帖最后由 shuofxz 于 2019-4-1 09:35 编辑
kklnkklnkkln 发表于 2019-4-1 00:38
大佬,最后问一个问题


看这个for循环,每一句话都被遍历了,在eachline里面。
如果包含要替换的单词,eachline里面对应的词会被替换然后放到content里面,没有要替换的词直接把eachline放到content里面。所以eachline里面是保存了所有行的信息的。
    for eachline in f_read:
        if rep_word in eachline:
            count += eachline.count(rep_word)
            eachline = eachline.replace(rep_word,new_word)
        content.append(eachline)

这里「为什么没有覆盖没有修改的语句,而只替换了修改过的语句」,不是没覆盖没修改的语句,而是content里面存了所有的语句,把原来的全都覆盖了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-10 09:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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