鱼C论坛

 找回密码
 立即注册
查看: 1310|回复: 18

[已解决]零基础Python 第29讲 for循环失效问题求助

[复制链接]
发表于 2018-8-17 08:04:52 | 显示全部楼层 |阅读模式

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

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

x
新手求助!零基础Python 第29讲中 ,我按照小甲鱼课件中讲解的代码自己写了一遍。却发现部分代码功能不能执行,找了好久没发现问题点。求指导!
小甲鱼讲解中,这段代码会执行出 :“boy_1.txt” ,    "boy_2.txt" ,   "girl_1.txt"  ,   "girl_2.txt"
我自己写的代码 仅会执行出:“file_name_boy” ,  “file_name_girl”  .  文件内容打开后是  "record.txt"文件中的第二段内容,按照男女拆分的功能是实现的。
我自己感觉是for 循环执行出了问题。
代码执行没有报错,但是代码段中在 “for each_line  in f ”这行 的中  “f”    ,  出现有异常提示:“Expect 'collections.Iterable , got 'TextIO' instead” 。
这种文本文件  应该是可以做迭达的呀

代码如下:

  1. f = open('D://record.txt')

  2. boy = []
  3. girl = []
  4. count = 1

  5. for each_line in f:
  6.     if each_line[:6] != '======':
  7.         #进行字符串分割识别
  8.         (role,content) = each_line.split(':',1)
  9.         if role == '小客服':
  10.             girl.append(content)
  11.         if role == '小甲鱼':
  12.             boy.append(content)
  13.     else:
  14.         # 进行文字分段存储
  15.         file_name_boy = 'boy_' + str(count) + '.txt'
  16.         file_name_girl = 'girl_' + str(count) + '.txt'

  17.         boy_file = open('D://file_name_boy','w')
  18.         girl_file = open('D://file_name_girl','w')

  19.         boy_file.writelines(boy)
  20.         girl_file.writelines(girl)

  21.         boy_file.close()
  22.         girl_file.close()

  23.         boy = []
  24.         girl = []
  25.         count += 1

  26. f.close()
复制代码


执行结果是:


最佳答案
2018-8-17 08:46:20
下面是完整代码:

  1. f = open('D://test.txt')

  2. boy = []
  3. girl = []
  4. count = 1

  5. for each_line in f:
  6.     if each_line[:6] != '======':
  7.         #进行字符串分割识别
  8.         (role,content) = each_line.split(':',1)
  9.         if role == '小客服':
  10.             girl.append(content)
  11.         if role == '小甲鱼':
  12.             boy.append(content)
  13.     else:
  14.         # 进行文字分段存储
  15.         file_name_boy = 'boy_' + str(count) + '.txt'
  16.         file_name_girl = 'girl_' + str(count) + '.txt'

  17.         boy_file = open(file_name_boy,'w')
  18.         girl_file = open(file_name_girl,'w')

  19.         boy_file.writelines(boy)
  20.         girl_file.writelines(girl)

  21.         boy_file.close()
  22.         girl_file.close()

  23.         boy = []
  24.         girl = []
  25.         count += 1
  26. # 进行文字分段存储
  27. file_name_boy = 'boy_' + str(count) + '.txt'
  28. file_name_girl = 'girl_' + str(count) + '.txt'

  29. boy_file = open(file_name_boy,'w')
  30. girl_file = open(file_name_girl,'w')

  31. boy_file.writelines(boy)
  32. girl_file.writelines(girl)

  33. boy_file.close()
  34. girl_file.close()
  35. f.close()
复制代码

执行结果

执行结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-17 08:10:35 | 显示全部楼层
本帖最后由 无符号整形 于 2018-8-17 08:32 编辑

1.您的输出的文件少了.txt,而且没有用已经弄好的字符串作为文件名。
另外您的情况实属罕见,您能不能在代码for循环之前插入一段代码
  1. print(isinstance(f,iterable))
复制代码

然后告诉我输出的结果?

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

使用道具 举报

 楼主| 发表于 2018-8-17 08:29:34 | 显示全部楼层
无符号整形 发表于 2018-8-17 08:10
1.您的输出的文件少了.txt,而且没有用已经弄好的字符串作为文件名。
另外您的情况实属罕见,您能不能在代 ...

收到。添加代码在for循环之前。
添加后会提示异常:“Unresolved reference 'iterable”

代码添加位置:
  1. f = open('D://record.txt')

  2. boy = []
  3. girl = []
  4. count = 1

  5. print(isinstance(f,iterable))

  6. for each_line in f:
  7.     if each_line[:6] != '======':
  8.         #进行字符串分割识别
  9.         (role,content) = each_line.split(':',1)
  10.         if role == '小客服':
  11.             girl.append(content)
  12.         if role == '小甲鱼':
  13.             boy.append(content)
复制代码


代码输出结果:

D:\Python\venv\Scripts\python.exe D:/Python/Diego/34525.py
Traceback (most recent call last):
  File "D:/Python/Diego/34525.py", line 6, in <module>
    print(isinstance(f,iterable))
NameError: name 'iterable' is not defined

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

使用道具 举报

发表于 2018-8-17 08:32:02 | 显示全部楼层
15010221388 发表于 2018-8-17 08:29
收到。添加代码在for循环之前。
添加后会提示异常:“Unresolved reference 'iterable”

好吧- -我又弄错了
是iter,把iterable改成iter试试??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-17 08:37:11 | 显示全部楼层
无符号整形 发表于 2018-8-17 08:32
好吧- -我又弄错了
是iter,把iterable改成iter试试??

收到。其他条件不变。更换 "iterable" 为 iter

代码段异常提示为:

Expected type 'Union[type, Tuple[Union[type, tuple], ...]]', got 'Union[(function: () -> _T, sentinel: _T) -> Iterator[_T], (iterable: Iterable[_T]) -> Iterator[_T]]' instead

代码输出结果:

D:\Python\venv\Scripts\python.exe D:/Python/Diego/34525.py
Traceback (most recent call last):
  File "D:/Python/Diego/34525.py", line 7, in <module>
    print(isinstance(f,iter))
TypeError: isinstance() arg 2 must be a type or tuple of types




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

使用道具 举报

发表于 2018-8-17 08:38:12 | 显示全部楼层
f是TextIO没问题,只是你的IDE语法提醒,只认迭代对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-17 08:41:00 | 显示全部楼层
15010221388 发表于 2018-8-17 08:37
收到。其他条件不变。更换 "iterable" 为 iter

代码段异常提示为:

好像倒也没问题。
你的IDE提示很亮眼……估计是你的IDE有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-17 08:44:35 | 显示全部楼层
塔利班 发表于 2018-8-17 08:38
f是TextIO没问题,只是你的IDE语法提醒,只认迭代对象

用的PyCharm2018年1月的社区版。。。我用其他IDLE试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-17 08:45:17 | 显示全部楼层
无符号整形 发表于 2018-8-17 08:41
好像倒也没问题。
你的IDE提示很亮眼……估计是你的IDE有问题

收到。我用找个其他的试试看!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-17 08:46:20 | 显示全部楼层    本楼为最佳答案   
下面是完整代码:

  1. f = open('D://test.txt')

  2. boy = []
  3. girl = []
  4. count = 1

  5. for each_line in f:
  6.     if each_line[:6] != '======':
  7.         #进行字符串分割识别
  8.         (role,content) = each_line.split(':',1)
  9.         if role == '小客服':
  10.             girl.append(content)
  11.         if role == '小甲鱼':
  12.             boy.append(content)
  13.     else:
  14.         # 进行文字分段存储
  15.         file_name_boy = 'boy_' + str(count) + '.txt'
  16.         file_name_girl = 'girl_' + str(count) + '.txt'

  17.         boy_file = open(file_name_boy,'w')
  18.         girl_file = open(file_name_girl,'w')

  19.         boy_file.writelines(boy)
  20.         girl_file.writelines(girl)

  21.         boy_file.close()
  22.         girl_file.close()

  23.         boy = []
  24.         girl = []
  25.         count += 1
  26. # 进行文字分段存储
  27. file_name_boy = 'boy_' + str(count) + '.txt'
  28. file_name_girl = 'girl_' + str(count) + '.txt'

  29. boy_file = open(file_name_boy,'w')
  30. girl_file = open(file_name_girl,'w')

  31. boy_file.writelines(boy)
  32. girl_file.writelines(girl)

  33. boy_file.close()
  34. girl_file.close()
  35. f.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-17 09:30:58 | 显示全部楼层
PythonWorld 发表于 2018-8-17 08:46
下面是完整代码:

谢谢兄弟。我对比了一下,区别在20行和21行。
你的代码我复制回去了,不报错。但是输出不了文档。

我怀疑是我电脑的问题。。。用shell 输入代码也是C:\Users\Administrator\Desktop\1534469357(1)一个效果。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-17 09:34:22 | 显示全部楼层
15010221388 发表于 2018-8-17 09:30
谢谢兄弟。我对比了一下,区别在20行和21行。
你的代码我复制回去了,不报错。但是输出不了文档。{:10_2 ...

输出的文件是在这段代码文件的同一个目录下面,每次运行完,最好把输出文件删除一遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-8-17 14:00:09 | 显示全部楼层
无符号整形 发表于 2018-8-17 08:32
好吧- -我又弄错了
是iter,把iterable改成iter试试??

哈哈哈哈哈哈,@无符号整形,超可爱啊你~哈哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-17 14:04:15 | 显示全部楼层
楼主同学,注意一下你的文件打开里边的,我都是习惯用D:\\(双反斜杠)
还有就是读取的文件里的#是中文格式还是英文格式,代码里搜索的#要和文件里的格式一致,否则找不到的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-17 17:48:30 | 显示全部楼层
新手完全看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 07:54:01 | 显示全部楼层
本帖最后由 15010221388 于 2018-8-20 07:58 编辑
PythonWorld 发表于 2018-8-17 09:34
输出的文件是在这段代码文件的同一个目录下面,每次运行完,最好把输出文件删除一遍


兄弟,又试了一下,发现了问题所在,你发的代码是可以正确执行的,我之前没去代码文件同目录内寻找输出结果,一直盯着我自己写的路径找。。。
问题确实是出在20行和21行。在其他条件和代码不变的情况下,20和21行你、我写法类似,但输出的结果区别很大。

A:仅可以执行出两个莫名其妙的文件(如1楼图)。
  1. boy_file = open('D://file_name_boy','w')
  2. girl_file = open('D://file_name_girl','w')
复制代码


B:可以正确执行出小甲鱼老师课件中的输出结果。
  1. boy_file = open(file_name_boy','w')
  2. girl_file = open(file_name_girl','w')
复制代码


结论:进行文字分段存储时,楼主“open”引用的变量名时书写的有问题。直接引用17和18行已经赋值好的变量名即可。
不需要像第1行那样再为open书写路径。书写路径后,似乎又重新给变量赋值,导致了奇葩出现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 08:00:37 | 显示全部楼层
lyfxpc 发表于 2018-8-17 17:48
新手完全看不懂

不算是啥技术问题,更多是我粗心和疏漏。检查代码时,我第一次没看到和课件中代码的区别。第二次没去代码对应的目录寻找。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 08:03:18 | 显示全部楼层
结了霜的泪 发表于 2018-8-17 14:04
楼主同学,注意一下你的文件打开里边的,我都是习惯用D:\\(双反斜杠)
还有就是读取的文件里的#是中文格 ...

谢谢,是我写的代码有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 08:04:51 | 显示全部楼层
结了霜的泪 发表于 2018-8-17 14:04
楼主同学,注意一下你的文件打开里边的,我都是习惯用D:\\(双反斜杠)
还有就是读取的文件里的#是中文格 ...

谢谢,是我写的代码有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 01:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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