【问题标题】:Python How to remove empty string of text filePython如何删除文本文件的空字符串
【发布时间】:2015-07-10 11:32:07
【问题描述】:

我有一个文本文件如下:

['23.5', '1.9', '11.3', '25.5', '2.7', '22.5', '3.4', '3.4', '2.9', '2.0', '2.0', '2.1 ','36.0','13.5','7.8','5.9','3.2','2.0','13.0','2.0','2.4','11.3','28.5','22.7', “2.6”、“2.2”、“7.0”、“12.5”、“18.2”、“7.2”、“13.5”、“14.0”、“2.4”、“2.3”、“2.1”、“2.0”、“5.3” ','3.2','3.1','2.6','20.0','13.0','1.9','2.2','2.3','22.7','30.5','45.5','2.8', '1.9'、'30.0'、'2.2'、'2.0'、'3.2'、'2.0'、'2.2'、'2.2'、'4.8'、'2.8'、'17.5'、'2.1'、'2.5' ','3.6','2.4','2.0','1.9','2.3','2.1','2.0','2.6','3.0','14.0','2.0','2.2', '12.5'​​、'38.5'、'38.0'、'13.0'、'3.2'、'3.7'、'3.7'、'2.0'、'2.1'、'2.1'、'9.3'、'8.0'、'27.0 ','13.5','9.3','15.5','17.5','3.5','2.0','27.0','2.0','1.9','23.2','15.5','6.5', '2.1'、'23.0'、'15.0'、'3.8'、'19.0'、'29.0'、'101.5'、'26.5'、'16.5'、'14.0'、'13.5'、'10.3'、'2.8 ','16.0','2.6','24.5','30.5','13.0','2.1','2.3','2.2','15.0','34.0','2.1','2.9', “6.8”、“2.7”、“12.3”、“7.1”、“28.5”、“30.0”、“8.7”​​、“13.0”、“6.0”、“9.0”、“15”。 0'、'15.5'、'8.0'、'15.0'、'1.9'、'36.0'、'17.0'、'17.5'、'28.0'、'4.2'、'9.0'、'5.3'、'7.8' , '6.2', '15.5', '2.2', '14.0', '30.0', '12.5'​​, '2.6', '10.0', '4.0', '6.7', '17.5', '2.7', ' 31.5'、'3.8'、'2.7'、'21.5'、'6.1'、'23.0'、'19.8'、'2.8'、'2.8'、'2.2'、'8.8'、'1.9'、'2.1' , '20.5', '3.6', '10.7', '2.0', '18.7', '12.7', '2.1', '1.9', '3.0', '14.5', '2.6', '2.0', ' 20.7'、'3.3'、'29.0'、'19.5'、'10.0'、'2.8'、'4.0'、'4.2'、'2.4'、'32.0'、'2.2'、'29.0'、'2.4' , '2.0', '20.0', '3.2', '2.2', '4.2', '2.8', '17.2', '2.0', '7.5', '15.7', '4.5', '2.8', ' 5.7'、'2.2'、'1.8'、'2.4'、'2.0'、'2.2'、'2.1'、'2.0'、'2.2'、'2.0'、'2.8'、'8.0'、'2.5' ,'3.3','2.1','2.0','2.0','2.0','2.1','19.5','13.8','9.2','5.5','2.5','2.2',' 2.1'、'3.1'、'8.6'、'2.3'、'3.7'、'10.8'、'2.1'、'2.0'、'2.4'、'20.0'、''、''、''、'' , '', '', '7', '', '', '2.0', '17.4', '8.7', '3.9', '2.0', '2.0', '5.9', '3.1', ' 22.8'、'4.1'、'2.8'、'7.6'、'4.9'、'2.7'、'26.5'、'2.1'、'2.2'、'2.4'、'2.0'、'3.8'、'5.7' , '2.8', '14.0 ','2.2','2.0','27.5','32.5','3.1','30.0','20.5','19.5','25.0','9.0','3.7','26.0', “13.5”、“15.0”、“1.9”、“2.2”、“3.7”、“2.0”、“2.2”、“2.3”、“2.1”、“2.1”、“1.9”、“2.0”、“2.0” ','2.4','2.3','2.5','16.0','6.5','19.5','2.0','4.1','9.4','51.5','2.1','15.4', “2.0”、“2.1”、“2.8”、“2.1”、“2.1”、“2.6”、“2.9”、“20.0”、“2.5”、“13.0”、“2.2”、“1.9”、“2.2” ','2.3','2.2','2.1','3.4','19.5','22.8','2.6','2.2','1.9','2.4','2.0','6.6', '3.2'、'1.9'、'2.0'、'2.6'、'2.0'、'14.0'、'2.0'、'3.0'、'19.8'、'5.4'、'3.6'、'5.9'、'2.2 ','3.6','2.0','2.0','9.8','2.4','3.3','3.0','28.0','47.0','5.8','3.1','20.5', '18.0'、'32.0'、'4.4'、'2.1'、'3.2'、'2.6'、'3.2'、'2.5'、'3.5'、'1.9'、'2.2'、'2.3'、'2.5' ','2.8','2.0','2.4','5.0','6.3','5.1','2.5','2.0','2.9','2.0','2.4','2.2', '3.3'、'5.0'、'2.6'、'2.7'、'1.9'、'3.0'、'2.1'、'2.4'、'2.7'、'16.5'、'5.2'、'2.2'、'2.2' ','3.2','5.5','24.5','17.5','2.1','2.7','3.6','2.2','2.1','8.1','3.1','2.1', '2.9', '2.1 ','2.1','2.0','2.3','1.9','13.7','3.2','2.1','2.6','5.1','23.5','24.5','3.1', '2.6'、'3.2'、'2.2'、'23.0'、'2.5'、'8.2'、'2.0'、'3.7'、'2.0'、'2.1'、'2.4'、'2.7'、'3.1 ','2.6','2.7','3.2','3.4','4.6','2.9','3.3','10.8','2.5','3.5','2.0','1.9', '2.2'、'2.1'、'2.1'、'2.1'、'2.1'、'2.1'、'31.8'、'14.4'、'1.9'、'2.8'、'5.0'、'2.5'、'2.5' '、'3.0'、'4.3'、'2.4'、'2.4'、'4.8'、'2.0'、'1.9'、'2.1'、'3.8'、'2.5'、''、''、'' , '', '', '', '7', '', '', '2.0', '3.4', '2.2', '3.5', '2.1', '2.4', '2.5', '3.0 ','2.1','2.0','5.6','2.3','4.9','1.9','1.9','21.5','2.4','1.9','2.0','2.3', '2.8'、'23.3'、'6.4'、'2.0'、'1.9'、'2.2'、'2.7'、'6.3'、'2.5'、'2.7'、'2.1'、'14.0'、'18.7' ','2.0','2.9','67.0','2.2','2.2','2.3','2.1','3.1','2.5','2.4','2.5','2.1', '2.0'、'28.0'、'7.2'、'3.1'、'37.5'、'17.5'、'2.0'、'30.0'、'2.4'、'2.2'、'2.2'、'29.0'、'4.9 ','2.7','2.2','2.2','3.5','4.2','1.9','2.0','3.8','1.9','2.4','2.8','19.5', '16.0'、'18.5'、'2.9'、'20.5'、' 3.1'、'1.9'、'2.3'、'2.3'、'30.0'、'13.0'、'3.2'、'2.2'、'2.6'、'2.1'、'47.0'、'2.6'、'2.5' ,'1.9','23.3','4.9','3.6','2.5','2.1','2.1','17.0','1.9','2.7','2.3','2.6',' 1.9'、'16.5'、'2.7'、'3.3'、'2.4'、'2.2'、'3.3'、'2.2'、'2.8'、'2.1'、'3.4'、'3.4'、'1.9' ,'2.0','3.7','2.0','21.5','2.1','2.2','2.3','2.3','6.8','1.9','2.8','3.3',' 5.4'、'125.0'、'2.7'、'39.3'、'24.0'、'30.5'、'2.4'、'2.5'、'10.0'、'2.6'、'2.3'、'2.3'、'2.4' ,'3.5','2.4','2.1','2.0','2.7','18.5','2.4','2.0','6.1','4.8','2.4','2.1',' 2.5'、'2.2'、'2.6'、'2.0'、'2.2'、'2.1'、'2.3'、'2.1'、'2.4'、'2.1'、'2.2'、'2.9'、'12.7' , '12.5'​​, '2.0', '3.0', '2.1', '2.6', '3.2', '3.0', '2.0', '2.5', '3.8', '4.9', '3.2', ' 1.9'、'10.2'、'2.0'、'1.9'、'9.0'、'3.5'、'6.6'、'3.1'、'2.2'、'4.9'、'6.7'、'1.9'、'5.5' ,'3.5','2.2','2.0','2.2','7.3','2.1','2.6','5.3','2.9','1.9','2.2','2.6',' 2.3'、'1.9'、'3.0'、'2.3'、'2.4'、'1.9'、'2.2'、'2.2'、'3.2'、'28.8'、'19.0'、'2.5'、'7.6' , '11.4', '4.6', ' 2.3'、'16.5'、'37.5'、'1.9'、'2.3'、'27.0'、'18.5'、'2.1'、'31.0'、'2.4'、'29.5'、'31.0'、'2.1' , '2.2', '2.4', '1.9', '2.2', '29.3', '11.1', '4.1', '29.0', '18.0', '21.0', '10.5', '2.5', ' ', '']

我想删除空字符串(例如:在红色列'') 并使用脚本

f= open('filename.txt','r') 
A1=f.read()

for i in A1:
    if i=="":
        A1.remove(i)
    print A1
    break

但是文件的空字符串仍然没有被删除

我很困惑,请帮帮我@@

【问题讨论】:

  • 文件空间末尾是否有“空字符串”?换行符?空' ' 部分?
  • open("output.txt","w").write(str(filter(None,literal_eval(open("input.txt").read())))
  • 为什么您认为将文本作为图像发布是个好主意? ...
  • 你能发一下吗?我不明白你评论@@?
  • 为什么不将filename.txt的内容粘贴为文本?

标签: python


【解决方案1】:

假设您的 input.txt 文件确实看起来像这样,您可以将 json.load 放到一个列表中,filter 取出所有 falsy 值(空字符串),最后将 json.dump 它返回输出文件

import json
with open("output.txt","wb") as f:
     cleaned_data = filter(None,json.load(open("input.txt")))
     json.dump(f,cleaned_data)

【讨论】:

    【解决方案2】:

    首先,确保 A1 实际上是一个列表:

    isinstance(A1, list)
    

    如果是这样,只需使用此列表推导来删除空引号。

    A1 = [i for i in A1 if i != '' and i != ', ']
    

    如果A1实际上是一个字符串,首先将其转换为一个列表:

    from ast import literal_eval 
    
    A1 = literal_eval(A1)
    

    另外,you cannot safely modify a list while iterating over it,这就是我使用列表解析从原始列表生成新过滤列表的原因。

    最后,如果您希望将值作为浮点数而不是字符串:

    A1 = [float(i) if isinstance(float(i), float) else i 
          for i in A1 if i != '' and i != ', ']
    

    【讨论】:

    • 最后一个答案解决了他的文件不仅仅是一堆由空格分隔的单个元素...... :) +1
    【解决方案3】:

    它不会让你在迭代元素时删除它。

    l = [line for line in A if line.strip()]
    print l
    

    【讨论】:

    • 根据 OP 的怪异图片,一行不仅仅是一个列表元素
    【解决方案4】:

    我个人是高阶函数的粉丝,过滤器让你做你想做的事变得超级容易:

    A1 = filter (lambda x: x != '', open("fname.txt", 'r').read().split(' '))
    

    Filter 接受两个参数;第一个是一个匿名函数,只存在于过滤函数的执行中。过滤器函数期望匿名函数返回一个布尔值。匿名函数接受一个参数,即数组的当前元素,并确定它是否符合某个标准。在这种情况下,如果元素不等于空字符串,则将其包含在新列表中。 filter 的另一个参数是一个可迭代的列表,我通过读取文件并将其拆分为空格来构建它。

    您可以使用大多数语言中内置的高阶函数来做一些巧妙的事情,否则这些函数需要迭代或其他无聊、正常的事情来做:)

    Here's a guide 到 Python 的高阶函数。

    【讨论】:

    • 您正在过滤掉所有非空字符串的对象,只留下空字符串
    【解决方案5】:

    看起来你所拥有的是将 Python 列表转储到文本文件中。让我们从那个文本文件中取回它,好吗?

    from ast import literal_eval    
    
    with open('path/to/file.txt') as f:
        result = ''.join(f)
        ## note that it's unclear from your question whether the text file
        ## is actually multiple lines, or just word wrapped. It it's just
        ## word wrapped, `result = f.read()` is sufficient
    
    result_lst = literal_eval(result)  # this includes the empty strings
    result_lst = filter(None, literal_eval(result))  # this doesn't
    

    【讨论】:

      【解决方案6】:

      由于python中没有内置的float函数,我会先make a simple function,导入文本文件,然后让列表解析完成剩下的工作:

      def isnumber(s):
          try:
              float(s)
              return True
          except ValueError:
              pass
          try:
              import unicodedata
              unicodedata.numeric(s)
              return True
          except (TypeError, ValueError):
              pass
          return False
      
      with open(filename, 'r') as f:
          l = f.read()
      
      result = [a for a in list(l.split("'")) if is_number(a)]
      

      【讨论】:

        【解决方案7】:

        尝试换行

        if i=="":
        

        if i == "''" or i == '""'
        

        【讨论】:

        • 为什么?这将删除 ''
        猜你喜欢
        • 2021-01-23
        • 2020-10-13
        • 2021-04-15
        • 2014-12-19
        • 1970-01-01
        • 2020-11-13
        • 2018-03-21
        • 2013-08-25
        相关资源
        最近更新 更多