如何使用Python从文本文件中删除回车符?

时间:2013-07-15 15:32:57

标签: python unicode tab-delimited tab-delimited-text

我用Google搜索的东西没有用,所以我转向专家!

我在制表符分隔的文本文件中有一些文本,其中有一些回车符(当我在Notepad ++中打开它并使用“显示所有字符”时,我看到[CR] [LF]结束时这条线)。我需要删除这个回车(或者不管它是什么),但我似乎无法弄明白。这是文本文件的片段,显示带回车符的行:

firstcolumn secondcolumn    third   fourth  fifth   sixth       seventh
moreoftheseventh        8th             9th 10th    11th    12th                    13th

这是我试图用来替换它的代码,但它没有找到回报:

with open(infile, "r") as f:
    for line in f:
        if "\n" in line:
            line = line.replace("\n", " ")

我的脚本找不到回车符。我做错了什么或对这个回车做出错误的假设?我可以在文本编辑器中手动删除它,但文本文件中大约有5000条记录也可能包含此问题。

更多信息: 这里的目标是从文本文件中选择两列,因此我在\ t字符上拆分并将值作为数组的一部分引用。它适用于没有返回的任何行,但在返回的行上失败,例如,这些行中没有元素9.

vals = line.split("\t")
print(vals[0] + " " + vals[9])

因此,对于上面的文本行,此代码失败,因为该特定数组中没有索引9。对于没有[CR] [LF]的文本行,它按预期工作。

6 个答案:

答案 0 :(得分:3)

从技术上讲,有一个答案!

with open(filetoread, "rb") as inf:
    with open(filetowrite, "w") as fixed:
        for line in inf:
            fixed.write(line)

open(filetoread, "rb")中的b显然以这样一种方式打开文件,即我可以访问这些换行符并删除它们。这个答案实际上是来自Stack Overflow用户Kenneth Reitz的网站。

谢谢大家!

答案 1 :(得分:1)

根据文件类型(以及它来自的操作系统等),您的回车可能是'\r''\n''\r'\n'。无论他们是哪一个,摆脱它们的最佳方法是使用line.rstrip()

with open(infile, "r") as f:
    for line in f:
        line = line.rstrip() # strip out all tailing whitespace

如果你想要除去回车而不是任何可能在最后的额外空格,你可以提供rstrip的可选参数:

with open(infile, "r") as f:
    for line in f:
        line = line.rstrip('\r\n') # strip out all tailing whitespace

希望这有帮助

答案 2 :(得分:1)

Python在所谓的universal newline mode中打开文件,因此新行总是\n

  

Python通常使用通用换行符支持构建;提供'U'   将文件作为文本文件打开,但行可以被任何一个终止   以下内容:Unix的行尾约定'\ n',Macintosh   约定'\ r',或Windows约定'\ r \ n'。 所有这些   外部表示被Python程序视为'\ n'。

您逐行遍历文件。而你正在替换行中的\n。但实际上没有\n因为行已被迭代器\n分隔,并且每行不包含\n

您只需阅读文件f.read()即可。然后替换其中的\n

with open(infile, "r") as f:
    content = f.read()
    content = content.replace('\n', ' ')
    #do something with content

答案 3 :(得分:1)

我要关闭这个。如果这不是关闭问题的正确方法,有人会告诉我。我意识到我从完全错误的角度出发。即使我可以删除回车,我最终会得到一条长线而不是5000条线。

感谢所有答案。无论如何我学到了一些东西。抱歉浪费了任何人的时间!

答案 4 :(得分:0)

我已经创建了一个代码来完成它并且有效:

    ArrayList<String> res = new ArrayList<String>();
        int i=0,j=0;

        while(i<l1.size() && j<l2.size()){
            res.add(l1.get(i++));
            res.add(l2.get(j++));
        }

        while(i<l1.size()){
            res.add(l1.get(i++));
        }
        while(j<l2.size()){
            res.add(l2.get(j++));
        }

        for (int j2 = 0; j2 < res.size(); j2++) {
            System.out.println(j2 +" : "+res.get(j2));
        }

答案 5 :(得分:0)

以下是如何在不使用临时文件的情况下删除回车:

with open(file_name, 'r') as file:
    content = file.read()

with open(file_name, 'w', newline='\n') as file:
    file.write(content)