【问题标题】:How can I remove carriage return from a text file with Python?如何使用 Python 从文本文件中删除回车符?
【发布时间】:2013-07-13 13:01:28
【问题描述】:

我用谷歌搜索的东西没有用,所以我求助于专家!

我在一个制表符分隔的文本文件中有一些文本,其中包含某种回车符(当我在 Notepad++ 中打开它并使用“显示所有字符”时,我在末尾看到 [CR][LF]线)。我需要删除这个回车(或任何它),但我似乎无法弄清楚。这是文本文件的 sn-p 显示一行带有回车符:

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] 的文本行,它按预期工作。

【问题讨论】:

  • 尝试搜索“\r\n”,这是 windows 的回车符。
  • 你把这些行写回文件吗?
  • 搜索 \r\n 失败。
  • 不,我不需要写回这些行。我只需要更改我使用它们的脚本中的值。
  • 为什么需要删除 EOL 字符?您是想将文件转换为 unix EOL 样式,还是只是想将数据连接在一起?如果是前者,你应该用f = open(filename,"w", newline="\n")打开,然后马上写回来。

标签: python unicode csv


【解决方案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】:

    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
    

    【讨论】:

    • 我还能访问这样的内容吗?对于内容行:
    • @mrcoulson 否。所有换行符都将替换为' '
    • 不清楚你想如何保留行并删除 [CR][LF]。
    • 文本文件中有记录过早结束。这些是我需要解决的。我是不是走错路了?
    【解决方案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。

    谢谢大家!

    【讨论】:

      【解决方案4】:

      我已经创建了一个代码来实现它并且它可以工作:

      end1='C:\...\file1.txt'
      end2='C:\...\file2.txt'
      with open(end1, "rb") as inf:
           with open(end2, "w") as fixed:
              for line in inf:
                  line = line.replace("\n", "")
                  line = line.replace("\r", "")
                  fixed.write(line)
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 使用临时文件可能会更好——如果在写入过程中出现错误,文件中的数据会丢失
        猜你喜欢
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多