首页 > 解决方案 > 如何确定文件中的行是否为空白,或者仅将填充的行写入文件,python 3x

问题描述

我试图读入一个文件,然后把它写出来,去掉所有的“空白”行。我的意思不是去掉所有空白的线条。我想保留所有缩进。我只想摆脱文本行之间的空白行。我打算用循环读取字符串并取出所有空行,但我对如何定义空行有点困惑。您不必逐个循环变量 char 来确定这一点。对吗?它似乎是一个“\n”,前后没有字符。基本上只有一个“\ n”,但到目前为止我还无法定义它。所以我推迟了在读取和写入文件时尝试逐行执行此操作。该文件需要保持缩进完整性,否则它将无法运行。

lines = []  

with open(file_name, mode='r+', encoding='utf-8') as f: 
   for line in f:
      if len(line) > 2:
        lines.append(line) 
        print(len(line)) 

   for line in f:
     f.write((str(line) for line in lines))

我只调用了打印函数来告诉我在读入时一行中有多少个字符,而且空白行似乎只读取为 1 个字符。(“\n”我假设?)所以我试图只附加任何内容> 1. 到目前为止,它只是将其准确地写入文件中。正如此处所示,我对使用 write 方法的态度也不是 100。大约 10 天前,我刚刚开始使用 python,我确定我做错了什么,这很可能真的很容易。

标签: python

解决方案


您的代码有几个问题:

  1. 测试长度不是检查空行的安全方法(文件的最后一行可能不会以换行符终止,如果它只有一个字符,你会丢弃它)。
  2. 您不会seek回到文件的开头,因此您永远不会替换当前数据;该文件已用尽,因此第二个循环永远不会发生。
  3. 您不能调用write生成器表达式;它不是一个字符串,所以如果它执行它就会死掉。
  4. 多亏了#2,#3 不会咬你,因为第二个循环永远不会运行(它试图循环一个用尽的文件,它没有要循环的行)。

固定代码:

lines = []  

with open(file_name, mode='r+', encoding='utf-8') as f: 
   for line in f:
      if line.rstrip('\n'):  # Check if it's empty after removing EOL character
        lines.append(line) 
        print(len(line)) 

   f.seek(0)            # Seek back to beginning of file so you overwrite existing data
   f.writelines(lines)  # Write out all the lines (they're already str, so no need to convert
                        # and writelines handles an iterable of lines, write doesn't)
   f.truncate()         # Truncate file to current file location so excess data removed

推荐阅读