鱼C论坛

 找回密码
 立即注册
查看: 1258|回复: 8

第029讲:文件:一个任务 ,第四个任务,将文件中的字符改名的问题

[复制链接]
发表于 2019-7-4 15:12:44 | 显示全部楼层 |阅读模式

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

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

x
程序如下,感觉我跟例题答案主要不一样的地方是我用了'r+'参数来读取文件,
而答案是先 r 读取 ,然后 再 w 写入。
但是'r+'应该是读写方式吧。
这个程序运行后,旧的文字没有替换修改啊。

#########################################################################


p=input("请输入文件名:")
q=("C:\\Users\\Administrator\\Desktop\\python\s\\"+p)
print("完整的文件名为:",q)
f=open(q,'r+')#读取并写入方式打开文件
a=input("请输入需要替换的文字:")
b=input("新替换的文字:")
for s in f:#用s遍历一下文件内容
    if a in s:#注意这个写法
        s=s.replace(a,b)
    else:
        print ("没有这个字")
f.close()

#########################################################################

我的 “b.txt” 文件内容是: “我爱我家” ,我现在想把 “我” 替换成 “你”

运行结果:

请输入文件名:b.txt
完整的文件名为: C:\Users\Administrator\Desktop\python\s\b.txt
请输入需要替换的文字:我
新替换的文字:你


打开b.txt 后 发现,文件内容没有发生变化

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-7-4 16:09:47 | 显示全部楼层
他的迭代器也许迭代出来的每一行都是重新生成的临时字符串,你改变临时字符串并没有改变文件内容
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-4 17:11:10 | 显示全部楼层
按照答案改了一下,但还是不行

###############################################

p=input("请输入文件名:")
q=("C:\\Users\\Administrator\\Desktop\\python\s\\"+p)
print("完整的文件名为:",q)
f=open(q,'r+')#读取并写入方式打开文件
c=[]#创建一个数组,用于替换
print("先打印一下文件内容:")
for s in f:
    print (s)
a=input("请输入需要替换的文字:")
b=input("新替换的文字:")
for s in f:#用s遍历一下文件内容
    if a in s:#注意这个写法
        s=s.replace(a,b)
        c.append(s)
    else:
        print ("没有这个字")
f.writelines(c)
f.close()
print ("打印c:",c)
print ("打印s:",s)

######################################################

现在的输出结果:

请输入文件名:b.txt
完整的文件名为: C:\Users\Administrator\Desktop\python\s\b.txt
先打印一下文件内容:
我爱我家
请输入需要替换的文字:我
新替换的文字:你
打印c: []
打印s: 我爱我家
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-4 17:11:57 | 显示全部楼层
Krant5 发表于 2019-7-4 16:09
他的迭代器也许迭代出来的每一行都是重新生成的临时字符串,你改变临时字符串并没有改变文件内容

考虑了这个问题,现在我的这个文件里边只有一行,但是还是不行啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-4 17:13:19 | 显示全部楼层
这个是课后的答案,我就是按照这个改的:

######################################################


def file_replace(file_name, rep_word, new_word):
    f_read = open(file_name)

    content = []
    count = 0

    for eachline in f_read:
        if rep_word in eachline:
            count = eachline.count(rep_word) #count感觉应该用这个
            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)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-4 17:30:22 | 显示全部楼层
如果改成这个样子的话,b.txt 就会被清空
##################################################
p=input("请输入文件名:")
q=("C:\\Users\\Administrator\\Desktop\\python\s\\"+p)
print("完整的文件名为:",q)

f=open(q)#读取文件
print("先打印一下文件内容:")
for s in f:
    print (s)

a=input("请输入需要替换的文字:")
b=input("新替换的文字:")
c=[]#创建一个数组,用于替换
for s in f:#用s遍历一下文件内容
    if a in s:#注意这个写法
        s=s.replace(a,b)
        c.append(s)
    else:
        print ("没有这个字")

f = open(q, 'w')
f.writelines(c)
f.close()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-4 17:35:35 | 显示全部楼层
wyft5t5 发表于 2019-7-4 17:11
考虑了这个问题,现在我的这个文件里边只有一行,但是还是不行啊

这跟几行有什么关系哦?,不管是几行,迭代器机制都不会发生变化的,难道你文件只有一行,操作那迭代的字符串就是操作文件本身了吗,并不是
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-4 17:53:29 | 显示全部楼层
知道原因了,是因为第一次打开文件,读取内容后没有关闭的原因,需要关闭后。再进行迭代。

程序如下:

(还有个小bug , else print ("没有这个字") ) ,这一句总爱打印出来

##################################################################

p=input("请输入文件名:")
q=("C:\\Users\\Administrator\\Desktop\\python\s\\"+p)
print("完整的文件名为:",q)

f=open(q)#读取文件
print("先打印一下文件内容:")
for s in f:
    print (s,end="")
print("")#回车换行
f.close()#注意这里,打印内容后,必须要先关闭文件,然后在下边重新打开

a=input("请输入需要替换的文字:")
b=input("新替换的文字:")
c=[]#创建一个数组,用于替换
f=open(q)#在这里要重新读取文件,否则会报错
for s in f:#用s遍历一下文件内容
    if a in s:#注意这个写法
        s=s.replace(a,b)
    c.append(s)
else:
        print ("没有这个字")

g = open(q, 'w')#重新以写入方式打开文件并逐行写入修改的内容
g.writelines(c)
g.close()#关闭
f.close()#关闭
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-4 18:01:47 | 显示全部楼层
使用 open(文件名,'r+') 这种方式打开并修改文件,在文件后添加了修改的内容。而不是直接修改

#############################################################

p=input("请输入文件名:")
q=("C:\\Users\\Administrator\\Desktop\\python\s\\"+p)
print("完整的文件名为:",q)
f=open(q)#读取并写入方式打开文件
c=[]#创建一个数组,用于替换
print("先打印一下文件内容:")
for s in f:
    print (s)
a=input("请输入需要替换的文字:")
b=input("新替换的文字:")
f.close()

f=open(q,'r+')#读取并写入方式打开文件
for s in f:#用s遍历一下文件内容
    if a in s:#注意这个写法
        s=s.replace(a,b)
        c.append(s)
    else:
        print ("没有这个字")
f.writelines(c)
f.close()
print ("打印c:",c)
print ("打印s:",s)

#########################################################

输出结果:

请输入文件名:b.txt
完整的文件名为: C:\Users\Administrator\Desktop\python\s\b.txt
先打印一下文件内容:
我爱我家
请输入需要替换的文字:我
新替换的文字:你
打印c: ['你爱你家']
打印s: 你爱你家

最后。b.txt  文件 内容变成了

我爱我家你爱你家


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-16 16:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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