【问题标题】:Strip blank lines from a text file从文本文件中去除空行
【发布时间】:2016-11-07 16:53:41
【问题描述】:

我正在尝试从文本文件中删除空白行,所以如果我有例如:

line 1
line 2

line 3


line 4
line 5

文件处理后的结果应该是这样的:

line 1
line 2
line 3
line 4
line 5

我搜索了堆栈溢出,这是我到目前为止得出的结果:

with open('file.txt', 'r+', encoding='utf-8') as file:
    for line in file:
        if line.strip():
            file.write(line)

除了有点不方便外,这一切都很好;不是用新内容替换原始内容,而是将结果附加到文件末尾,如下所示:

line 1
line 2

line 3


line 4
line 5line 1
line 2
line 3
line 4
line 5

我的问题是,有什么方法可以在没有外部存储的情况下在 for 循环中解决此问题(将结果存储在文件或列表中并将其写回文件中)?或者如果有更好的方法请分享。

我希望我的问题很清楚,谢谢。

【问题讨论】:

标签: python file


【解决方案1】:

这是一个工作示例,可以满足您的需求。 我不确定这里的性能,但可以肯定它不使用内存或临时文件

writebytecount = 0
readbytecount = 0
with open('file2.txt', 'r+') as file:
    while 1:
        line = file.readline()
        if not line: break
        readbytecount = file.tell()
        file.seek(writebytecount)
        file.write(line)
        if len(line.strip()) != 0:
            writebytecount += len(line)+1
        file.seek(readbytecount)
    file.seek(writebytecount)
    file.truncate(writebytecount)
    file.close()

【讨论】:

    【解决方案2】:

    首先,输出被附加到文件中,因为您以r+ 模式打开文件并且文件指针指向文件末尾。但是,您不想在读取文件时覆盖它,因此您确实需要两个文件:

    with open('infile.txt', 'r', encoding='utf-8') as inFile,\
         open('outfile.txt', 'w', encoding='utf-8') as outFile:
        for line in inFile:
            if line.strip():
                outFile.write(line)
    

    【讨论】:

    • 我希望有办法避免这种情况,但没关系。非常感谢。
    • 没问题,很高兴为您提供帮助! :) 写入后,您始终可以用新创建的文件覆盖原始文件。这还有一个额外的好处,即如果出现问题,您可以避免丢失数据。
    猜你喜欢
    • 2013-01-30
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多