鱼C论坛

 找回密码
 立即注册
查看: 1460|回复: 3

[已解决]python 第29课动动手第4题求助!

[复制链接]
发表于 2021-11-22 18:58:26 | 显示全部楼层 |阅读模式

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

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

x
小甲鱼老师的程序里运用了count方法和replace方法。
但是我当时做这道题的时候没有想到这两个简单的方法。
只能用f.read(1) == 设定的字符 来计数。
替换的话 我想用递归的方法不停地切割字符串并组合的方法。
结果发现根本行不通。 请教大神们我这个代码到底有什么问题??

file_name = input("请输入文件名:")
word = input("请输入需要替换的字符:")
new_word = input("请输入新的字符:")
count = 0
f = open(file_name,encoding='UTF-8')
while True:
    if f.read(1) != '':
        if f.read(1) == word:
            count += 1
        else:
            continue
    else:
        break
f.close()
print("文件"+file_name+"中共有%d个"%count+word)
answer = input("您确定要把所有的%s换成%s吗?YES or NO"%(word,new_word))
def change():
    if word in (f.read()):
        (a,b) = (f.read()).split(word,1)
        c = a+new_word+b
        f = open(file_name,'w',encoding='UTF-8')
        f.write(c)
        change()
    else:
        return c
if answer == "YES":
    f = open(file_name,encoding='UTF-8')
    change()
    f.close()
else:
    print("不改变原文件")


以下是报错:
请输入文件名:E:\\something.txt
请输入需要替换的字符:是
请输入新的字符:不是
文件E:\\something.txt中共有3个是
您确定要把所有的是换成不是吗?YES or NOYES
Traceback (most recent call last):
  File "E:/python/练习/课后习题.py", line 28, in <module>
    change()
  File "E:/python/练习/课后习题.py", line 18, in change
    if word in (f.read()):
UnboundLocalError: local variable 'f' referenced before assignment

其中求得共有几个“是”的时候 答案显然不是3个  但是我跑出来3个。不懂求解答!
最佳答案
2021-11-23 11:39:14
    首先解决数目不对的问题,每次read(1)一次,指针就会往下移一个,你每次判断read(1)是否位空的时候,指针往下,你再read(1)来判断是否等于word时已经是下一个字符了,等于只有第偶数位的字符才能被判断,解决方法就是先赋值给变量,然后拿变量来进行判断。
    第二个问题的错误提示,是你在自定义函数中修改了外部变量,把变量指定为全局变量就不会报错了,但是改完这个还有一堆的问题,看程序注释吧。
file_name = input("请输入文件名:")
word = input("请输入需要替换的字符:")
new_word = input("请输入新的字符:")
count = 0
f = open(file_name,encoding='UTF-8')
while True:
    a = f.read(1)                     #<---第一个错误修正处,包括下面两行
    if a != '':
        if a == word:
            count += 1
        else:
            continue
    else:
        break
f.close()
print("文件"+file_name+"中共有%d个"%count+word)
answer = input("您确定要把所有的%s换成%s吗?YES or NO"%(word,new_word))

def change():
    global f                          #<---第二个错误修正处,把f加入全局变量就不会报这个错了
    f = open(file_name,encoding='UTF-8')      #<---不重新以read方式打开文件,递归调用的文件状态是w,不能读
    d = f.read()                      #<---犯了和第一个错误一样的问题,你需要研究一下文件指针问题了
    if word in d:
        (a,b) = d.split(word,1)
        c = a+new_word+b
        f = open(file_name,'w',encoding='UTF-8')
        f.write(c)
        change()
    else:
        return              #<--- 返回c没用呀,你递归中又没有用到,一定要返回c,把c也指定为全局变量,不然报错

if answer == "YES":
    change()
    f.close()
else:
    print("不改变原文件")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-22 20:33:21 | 显示全部楼层
你的代码问题:UnboundLocalError: local variable 'f' referenced before assignment
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-23 11:39:14 | 显示全部楼层    本楼为最佳答案   
    首先解决数目不对的问题,每次read(1)一次,指针就会往下移一个,你每次判断read(1)是否位空的时候,指针往下,你再read(1)来判断是否等于word时已经是下一个字符了,等于只有第偶数位的字符才能被判断,解决方法就是先赋值给变量,然后拿变量来进行判断。
    第二个问题的错误提示,是你在自定义函数中修改了外部变量,把变量指定为全局变量就不会报错了,但是改完这个还有一堆的问题,看程序注释吧。
file_name = input("请输入文件名:")
word = input("请输入需要替换的字符:")
new_word = input("请输入新的字符:")
count = 0
f = open(file_name,encoding='UTF-8')
while True:
    a = f.read(1)                     #<---第一个错误修正处,包括下面两行
    if a != '':
        if a == word:
            count += 1
        else:
            continue
    else:
        break
f.close()
print("文件"+file_name+"中共有%d个"%count+word)
answer = input("您确定要把所有的%s换成%s吗?YES or NO"%(word,new_word))

def change():
    global f                          #<---第二个错误修正处,把f加入全局变量就不会报这个错了
    f = open(file_name,encoding='UTF-8')      #<---不重新以read方式打开文件,递归调用的文件状态是w,不能读
    d = f.read()                      #<---犯了和第一个错误一样的问题,你需要研究一下文件指针问题了
    if word in d:
        (a,b) = d.split(word,1)
        c = a+new_word+b
        f = open(file_name,'w',encoding='UTF-8')
        f.write(c)
        change()
    else:
        return              #<--- 返回c没用呀,你递归中又没有用到,一定要返回c,把c也指定为全局变量,不然报错

if answer == "YES":
    change()
    f.close()
else:
    print("不改变原文件")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-11-26 12:29:31 | 显示全部楼层
txxcat 发表于 2021-11-23 11:39
首先解决数目不对的问题,每次read(1)一次,指针就会往下移一个,你每次判断read(1)是否位空的时候,指 ...

太感谢大神了,我应该就是指针问题没注意到,然后可写文件不可读这个我也压根没想到。多谢指正!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 18:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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