删除Python文本文件中的空白行/空行

时间:2020-11-05 22:10:38

标签: python

我有一个文本文件,其中包含以下内容:

Line 1
,
,
Line 2
,
Line 3
,
Line 4

我想创建一个删除行之间空白的功能(用标记,以示说明)

到目前为止,我已经使用以下代码创建了一个函数,但是运行此代码却没有任何反应:

with open('path/to/file.txt', 'r') as f: 
    for line in f:           
        line = line.strip()  

感谢您的帮助。

7 个答案:

答案 0 :(得分:2)

您需要在更改后覆盖文件

with open('path/to/file.txt', 'r') as f:  
    new_text = '\n'.join([line.strip() for line in f.read().split('\n')] if line.strip())
    with open('path/to/file.txt','w') as in_file: 
        in_file.write(new_text)

答案 1 :(得分:2)

line.strip()仅会删除该行 ,但这并不意味着如果该行为空,该行将以某种方式消失。此外,您永远不会真正将(已处理的)行存储在(另一个)文件中。

您可以使用以下方法处理文件并将结果写到target.txt文件中:

with open('path/to/file.txt', 'r') as f:
    with open('path/to/target.txt', 'w') as w:
    for line in f:
        if line.strip():
            w.write(line)

如果您还想剥离非空行,因此要从所有行中删除前导和尾随空格,则可以使用已剥离的变体:

with open('path/to/file.txt', 'r') as f:
    with open('path/to/target.txt', 'w') as w:
    for line in f:
        line = line.strip()
        if line:
            w.write(line)
            w.write('\n')

该程序将逐行读取文件,这对于大文件通常更好,因为在内存中加载大文件可能会导致内存问题。

此外,通常最好将结果存储在另一个文件中。如果计算机在处理过程中崩溃(例如由于电源故障),则您仍然拥有原始文件。大多数Linux命令旨在写入另一个文件。这样一来,当操作完成后,您可以将目标移到原始文件。

答案 2 :(得分:1)

我会这样处理:

with open('path/to/file.txt', 'r+') as f:
    lines = f.readlines()
    lines = [line.strip() for line in lines]
    f.writelines(line)

答案 3 :(得分:1)

您可以这样删除空行:

with open("txt.txt", "r") as f:
  for l in f:
    if l == "\n":
      l = l.replace("\n", "")
    with open("output.txt", "a") as f2:
        f2.write(l)

答案 4 :(得分:1)

如果要从现有文件中删除空白行而不写入新文件,则可以以读写模式(由'r+'表示)再次打开同一文件进行写入。写入完成后,在写入位置截断文件:

with open('file.txt') as reader, open('file.txt', 'r+') as writer:
  for line in reader:
    if line.strip():
      writer.write(line)
  writer.truncate()

演示:https://repl.it/@blhsing/KaleidoscopicDarkredPhp

答案 5 :(得分:0)

如果要从现有文件中删除空白行而不写入新文件,则可以使用随机访问。以读写二进制模式打开文件,在逐行读取时使用file.tell方法跟踪文件的读取位置,在写入非空白行时跟踪文件的写入位置,恢复当您使用file.seek方法进行读写时,读取和写入位置,最后,使用file.truncate方法在最后一个写入位置截断文件:

write_position = 0
with open('file.txt', 'rb+') as f:
  for line in f:
    if line.strip():
      read_position = f.tell()
      f.seek(write_position)
      f.write(line)
      write_position = f.tell()
      f.seek(read_position)
  f.truncate(write_position)

演示:https://repl.it/@blhsing/UncommonRevolvingTransversals

答案 6 :(得分:-1)

> docker run -it debian:buster-slim bash
root@60a90ca657de:/# zic --version
zic (Debian GLIBC 2.28-10) 2.28
root@60a90ca657de:/# zic -b
zic: invalid option -- 'b'
zic: usage is zic [ --version ] [ --help ] [ -v ] \
        [ -l localtime ] [ -p posixrules ] [ -d directory ] \
        [ -L leapseconds ] [ filename ... ]

Report bugs to <http://www.debian.org/Bugs/>.