鱼C论坛

 找回密码
 立即注册
查看: 1756|回复: 7

[已解决]??为什么我的文件刚刚创建就是不可读的

[复制链接]
发表于 2023-8-13 13:35:25 | 显示全部楼层 |阅读模式

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

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

x
难绷,我为啥读不了自己的文件????
>>> f.write('I love FishC\n')
13
>>> f.readable()
False
>>> f = open('长安街','w')
>>> f.writable()
True
>>> f.readable ()
False
>>> f.writelines (['第一人','毛主席'])
>>> f.write('天和')
2
>>> for each in f:
        print(each)

        
Traceback (most recent call last):
  File "<pyshell#136>", line 1, in <module>
    for each in f:
io.UnsupportedOperation: not readable


最佳答案
2023-8-13 13:36:11
根据你提供的代码和错误提示,可以看出你在打开文件后使用了 w 模式来写入内容。在这种模式下,文件是以覆盖的方式打开的,意味着如果文件已经存在,则会被清空。因此,创建文件后立即尝试读取它是不可行的,因为文件中没有任何内容可读。

另外,使用 w 模式打开文件后,该文件对象只能进行写操作,而不能进行读操作,因此 f.readable() 返回 False。

由于文件已经被清空,所以无法使用 for each in f 进行迭代读取,因为文件已经为空。

如果你想要先写入文件,然后再读取文件的内容,可以考虑使用 a+ 模式打开文件,这将允许你进行追加写入和读取操作。修正后的代码如下:
f = open('长安街', 'a+')
f.write('I love FishC\n')
f.seek(0)  # 将文件指针移动到文件开头
print(f.readable())  # True

f.seek(0)  # 再次将文件指针移动到文件开头
for line in f:
    print(line.strip())

f.close()

在上述代码中,我们使用 a+ 模式打开文件,先写入内容,然后通过 f.seek(0) 将文件指针移动到文件开头,接着可以进行读取操作了。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-13 13:36:26 | 显示全部楼层
前四行代码是之前的内容,从第五行开始我给  f  重新赋值了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 13:35:47 | 显示全部楼层
问题出在你创建文件的方式上。在打开文件时,你需要指定文件的打开模式。在你的代码中,你使用了'w'模式来打开文件,这意味着你只能写入文件,而不能读取文件。因此,当你尝试使用 f.readable() 时,它返回False。

如果你希望既能写入又能读取文件,你可以使用'w+'模式来打开文件。修改你的代码如下:
f = open('长安街', 'w+')

这样,你就可以通过 f.readable() 来检查文件是否可读,并且可以使用 f.read() 来读取文件的内容。

另外,你还需要注意的是,在写入文件后,文件指针会指向文件的末尾。因此,当你尝试使用 for each in f 来遍历文件时,由于文件指针已经在文件末尾,所以不会有任何输出。如果你想遍历文件的内容,你需要将文件指针重新定位到文件的开头。可以使用 f.seek(0) 来实现:
f.seek(0)
for each in f:
    print(each)

这样,你就可以正确地遍历文件的内容了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 13:36:11 | 显示全部楼层    本楼为最佳答案   
根据你提供的代码和错误提示,可以看出你在打开文件后使用了 w 模式来写入内容。在这种模式下,文件是以覆盖的方式打开的,意味着如果文件已经存在,则会被清空。因此,创建文件后立即尝试读取它是不可行的,因为文件中没有任何内容可读。

另外,使用 w 模式打开文件后,该文件对象只能进行写操作,而不能进行读操作,因此 f.readable() 返回 False。

由于文件已经被清空,所以无法使用 for each in f 进行迭代读取,因为文件已经为空。

如果你想要先写入文件,然后再读取文件的内容,可以考虑使用 a+ 模式打开文件,这将允许你进行追加写入和读取操作。修正后的代码如下:
f = open('长安街', 'a+')
f.write('I love FishC\n')
f.seek(0)  # 将文件指针移动到文件开头
print(f.readable())  # True

f.seek(0)  # 再次将文件指针移动到文件开头
for line in f:
    print(line.strip())

f.close()

在上述代码中,我们使用 a+ 模式打开文件,先写入内容,然后通过 f.seek(0) 将文件指针移动到文件开头,接着可以进行读取操作了。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 13:49:45 | 显示全部楼层
另外记得及时关闭文件 f.close() 不然文件一直处于占用状态,挂后台了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-13 13:51:23 | 显示全部楼层
歌者文明清理员 发表于 2023-8-13 13:49
另外记得及时关闭文件 f.close() 不然文件一直处于占用状态,挂后台了

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

使用道具 举报

发表于 2023-8-13 13:59:47 | 显示全部楼层

另外 3 楼回答是错误的,w 模式是写入模式,a 模式是追加,a 模式也不能读,只有 r 模式或者 a+ r+ w+ 才能写入和读取,不过他们之间还是 有区别的,这点可以搜到
,w 模式不是因为没有内容可读,而是模式不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-15 12:17:07 | 显示全部楼层
歌者文明清理员 发表于 2023-8-13 13:59
另外 3 楼回答是错误的,w 模式是写入模式,a 模式是追加,a 模式也不能读,只有 r 模式或者 a+ r+ w+ 才 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 19:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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