Python 如何从文件中删除空行/空行?

Python 如何从文件中删除空行/空行?,python,Python,我的问题是我的文本文件时不时地添加空行,这使得我的程序无法按预期工作。我想知道,从这两个部分来看,我的代码中是否存在导致这种情况发生的因素,或者是否有一种方法可以从文件中删除这些空行,或者即使它们存在于文件中,也仍然可以工作 def results_from_file(file_name): my_file = open(file_name, "r") data = my_file.read().split("\n")

我的问题是我的文本文件时不时地添加空行,这使得我的程序无法按预期工作。我想知道,从这两个部分来看,我的代码中是否存在导致这种情况发生的因素,或者是否有一种方法可以从文件中删除这些空行,或者即使它们存在于文件中,也仍然可以工作


def results_from_file(file_name):
    
    my_file = open(file_name, "r")
    data = my_file.read().split("\n")      
            
    results = []
        
    for row in data:
        results.append(row.strip(";").split(";"))


 
    return results 

因为代码片段非常小,并且非常依赖于其他东西,所以我可以给出一般性的建议

  • 像这样使用开放上下文管理器
  • 打开(文件名为“r”)作为输入文件的
    这将确保文件最终被关闭,并且更加干净

    2.由于您要逐行执行,因此您可以直接从文件实例迭代这些行

    打开(文件名为“r”)作为输入文件的
    :
    对于输入_文件中的行:
    通过
    
    3.我能想到的地方是在
    results
    中的空结果中创建空行。我会在编写空结果之前对其进行过滤,此外,您还需要调试创建结果的代码,以找到空行问题的原因

    对于结果中的结果:
    if result.strip()!="":
    my_file.write(“{}\n”.format(“;”.join(result)))
    
    我不确定您是否担心读取有空行的文件或以产生空行的方式写入文件会导致空结果,但这里有一种相对可靠的方法来确保这两种情况都不会发生:

    def results_from_file(filename):
        with open(filename, 'r') as f:
            results = [[r.strip() for r in line.split(';')] for line in f]
            results = [[r for r in row if r] for row in results if row]
            return [row for row in results if row]
    
    def save_results_to_file(filename, results):
        with open(filename, 'w') as f:
            for parts in results:
                if parts:
                    f.write(';'.join([res for res in parts if res]) + '\n')
    
    例如:

    # setup
    filename = 'foo'
    txt = """line 1 res 0;;; line1 res 1; line 1 res 2  
    line 2 res 3; ;    line2 res 4; 
    line 3 res 5
    
    line 5 res 6
    """
    
    with open(filename, 'w') as f:
        f.write(txt)
    
    
    # 2. test read
    results = results_from_file(filename)
    # results:
    [['line 1 res 0', 'line1 res 1', 'line 1 res 2'],
     ['line 2 res 3', 'line2 res 4'],
     ['line 3 res 5'],
     ['line 5 res 6']]
    
    # 3. mess up purposely the results
    results.insert(2, [])
    results.insert(0, [])
    # results:
    [[],
     ['line 1 res 0', 'line1 res 1', 'line 1 res 2'],
     ['line 2 res 3', 'line2 res 4'],
     [],
     ['line 3 res 5'],
     ['line 5 res 6']]
    
    # 4. write to file with filtering
    save_results_to_file(filename, results)
    
    # check:
    ! cat $filename
    line 1 res 0;line1 res 1;line 1 res 2
    line 2 res 3;line2 res 4
    line 3 res 5
    line 5 res 6
    

    如果
    results
    中有一个空字符串,该怎么办?此外,尾随的换行符将干扰您的
    拆分
    ,并在末尾添加一个空行,因此您应该执行
    .splitlines()
    .strip().split(“\n”)
    是否有办法从文件中删除这些空行
    ”。如果存在空字符串,为什么不签入
    my\u file.read().split(“\n”)
    ?请放在一边:打开文件但从不关闭它们。请使用带有open(…)的
    作为f:
    上下文,以避免今后的许多麻烦。
    # setup
    filename = 'foo'
    txt = """line 1 res 0;;; line1 res 1; line 1 res 2  
    line 2 res 3; ;    line2 res 4; 
    line 3 res 5
    
    line 5 res 6
    """
    
    with open(filename, 'w') as f:
        f.write(txt)
    
    
    # 2. test read
    results = results_from_file(filename)
    # results:
    [['line 1 res 0', 'line1 res 1', 'line 1 res 2'],
     ['line 2 res 3', 'line2 res 4'],
     ['line 3 res 5'],
     ['line 5 res 6']]
    
    # 3. mess up purposely the results
    results.insert(2, [])
    results.insert(0, [])
    # results:
    [[],
     ['line 1 res 0', 'line1 res 1', 'line 1 res 2'],
     ['line 2 res 3', 'line2 res 4'],
     [],
     ['line 3 res 5'],
     ['line 5 res 6']]
    
    # 4. write to file with filtering
    save_results_to_file(filename, results)
    
    # check:
    ! cat $filename
    line 1 res 0;line1 res 1;line 1 res 2
    line 2 res 3;line2 res 4
    line 3 res 5
    line 5 res 6