免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10598 | 回复: 11
打印 上一主题 下一主题

请教:怎样用python读取文件之后,处理在下一行、空行、和*星星 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-11 15:58 |只看该作者 |倒序浏览
我有一个.txt文件,是一个电路的网表图,它的形式大概是这样的:
** 我是.txt网表图生成于2014年11月11日 信来砍
电容A A的电容值 A的位置
电容B B的电容值 B的位置
电感C C的电感值 C的位置
电阻D D的电阻值 D的位置
(这是一个空行什么都没有)
二极管E E的尺寸 E的位置
二极管F F的尺寸 F的位置
三极管G G的尺寸 G的位置
  
我需要用python读取这个.txt文件,然后
1 删除所有以两个星星**开头的行(电路的网表图.txt文件的注释是两个星星);
2 删除所有空行;
3 删除所有既以“二极管”开头、又在“三极管”所在行正上方的行。所以,我需要用python生成的文件是这样的:
  
电容A A的电容值 A的位置
电容B B的电容值 B的位置
电感C C的电感值 C的位置
电阻D D的电阻值 D的位置
二极管E E的尺寸 E的位置
三极管G G的尺寸 G的位置
  
这3个操作我都想请教大家。这是我写的python:
  
row_count = 0
row_count_next = 0
list_row = []
f_in = file(CKT_R, "r")
f_in_split = f_in.read().splitlines()
f_out = file(CKT_W, "w")
for row in f_in_split:
     row_count_next = row_count + 1
     row_count = row_count + 1
     if row.startswith('**'):
                 删掉这个row
     if (row.startswith('') and row.endswith('')):
                 删掉这个row
     if f_in_split[row_count_next].startswith('三极管')):
         ……
  
问题1是:row.startswith('**')中的两个星星,python不认为它们只是普通符号,而是类似*arg或者**arg之类的表示省略的符号……
  
问题2是:row.startswith('') and row.endswith(''),空行在python中如何表示?
  
问题3是:我用row_count_next = row_count + 1来让python读下一行,但是假设这个.txt文件只有3行,python会试图去读第4行、然后报出一个out of index的error……
  
请问这3个问题如何解决?谢谢!

论坛徽章:
0
2 [报告]
发表于 2014-11-11 19:38 |只看该作者
本帖最后由 whitelotus19 于 2014-11-11 19:49 编辑

你试试看有没有不对的地方
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. text='''
  4. ** 我是.txt网表图生成于2014年11月11日 信来砍
  5. 电容A A的电容值 A的位置
  6. 电容B B的电容值 B的位置
  7. 电感C C的电感值 C的位置
  8. 电阻D D的电阻值 D的位置

  9. 二极管E E的尺寸 E的位置
  10. 二极管F F的尺寸 F的位置
  11. 三极管G G的尺寸 G的位置
  12. 电阻D D的电阻值 D的位置
  13. 三极管G G的尺寸 G的位置
  14. '''
  15. lines=text.strip().split('\n')
  16. llen=len(lines)
  17. result=[lines[i] for i in range(llen-1) if not lines[i].startswith('**') if lines[i].strip() \
  18.         if not (lines[i].startswith('二极管') and lines[i+1].startswith('三极管'))]
  19. result.append(lines[llen-1])
  20. for x in result:
  21.     print x.decode('utf-8')
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-11-12 16:19 |只看该作者
with open('test.txt','r') as fp:
    text = fp.readlines()
for i in range(len(text)-1,-1,-1) :
    if text[i].startswith('**'):
        del text[i]
    elif  '\n' == text[i] :
        del text[i]
with open('test.txt','w') as fp:
     for line in text: fp.write(line)

论坛徽章:
0
4 [报告]
发表于 2014-11-13 15:29 |只看该作者
回复 2# whitelotus19

先谢谢白莲花了!

还是那两个星星的问题,python始终认为**是特殊符号...


   

论坛徽章:
0
5 [报告]
发表于 2014-11-13 15:32 |只看该作者
回复 3# kyrie_liu

先谢谢了!

还是那两个星星的问题,python始终认为**是特殊符号,所以.startswith('**'):是个病句...

论坛徽章:
0
6 [报告]
发表于 2014-11-13 16:40 |只看该作者
本帖最后由 whitelotus19 于 2014-11-13 16:42 编辑



这个执行结果不对?

果然不对

论坛徽章:
0
7 [报告]
发表于 2014-11-13 17:38 |只看该作者
不是**的问题,是我前面的代码写得有问题。

论坛徽章:
0
8 [报告]
发表于 2014-11-13 17:52 |只看该作者
这样偷懒判断一下呢?
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. text='''
  4. ** 我是.txt网表图生成于2014年11月11日 信来砍
  5. 电容A A的电容值 A的位置
  6. 电容B B的电容值 B的位置
  7. 电感C C的电感值 C的位置
  8. 电阻D D的电阻值 D的位置

  9. 二极管E E的尺寸 E的位置
  10. 二极管F F的尺寸 F的位置
  11. 三极管G G的尺寸 G的位置
  12. 电阻D D的电阻值 D的位置
  13. 三极管G G的尺寸 G的位置
  14. '''
  15. lines=text.strip().split('\n')
  16. llen=len(lines)
  17. result=[lines[i] for i in range(llen-1) if not lines[i].startswith('**') if lines[i].strip() \
  18.         if not (lines[i].startswith('二极管') and lines[i+1].startswith('三极管'))]
  19. if not lines[llen-1].startswith('**'):
  20.     result.append(lines[llen-1])
  21. print '\n'.join(result).decode('utf-8')
复制代码

论坛徽章:
0
9 [报告]
发表于 2014-11-21 17:48 |只看该作者
回复 8# whitelotus19

谢谢白莲花耐心的回复!问题已解决。

不知是不是版本问题,我的python始终认为.startswith('**')和.endswith('**')中的*是表示省略的特殊符号。后来我干脆直接截取string[0:-3],不用.startswith了,**的问题也就不存在了。

再次感谢!

论坛徽章:
3
天秤座
日期:2014-10-29 11:37:572015元宵节徽章
日期:2015-03-06 15:50:39NBA常规赛纪念章
日期:2015-05-04 22:32:03
10 [报告]
发表于 2014-11-21 21:43 |只看该作者
需要转义??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP