字符串中的'\ n'时,写入文件不会转到新行

时间:2019-05-13 14:16:33

标签: python python-3.x

我有一个.txt文件,其中仅包含一行文本。例如: command1;\ncommand2, output;\ncommand3\ncommand4, output;\n(但更长)。由于很难阅读,我想将此文件更改为更具可读性的版本。我想删除所有';'并用新行替换'\n'

对于这个问题,我几乎没有可行的解决方案: 例如,我可以删除所有'\n'并使用print函数。或者,将\\n替换为\n

def clean_file(file):
    # read file
    with open(file) as f:
        content = f.readline()
    # get rid of ';' and '\n'
    content = content.split(';')
    for ind, val in enumerate(content):
        content[ind] = val.replace('\\n', '\n')  # it can be also replace(r'\n', '\n')
    # write to file
    with open(file, 'w') as f:
        for line in content:
            f.write(line)

OUT:
command1
command2, output
command3
command4, output

在这种情况下,它可以正常工作! 但是我不知道为什么在删除替换零件时它不起作用:

def clean_file(file):
    # read file
    with open(file) as f:
        content = f.readline()
    # get rid of ';'
    content = content.split(';')
    # write to file
    with open(file, 'w') as f:
        for line in content:
            f.write(line)

OUT:
command1\ncommand2, output\ncommand3\ncommand4, output\n

这将把所有内容打印在一行中。

有人可以向我解释为什么我必须用相同的值替换'\n'吗? 该文件已创建,我正在Windows上打开它,但脚本正在Linux上运行。

2 个答案:

答案 0 :(得分:1)

Windows世界中的大多数编辑器(从记事本开始)要求\r\n才能正确显示行尾并仅忽略\n。另一方面,在Linux上,单个\n对于行尾就足够了。如果您在Windows上运行Python脚本,它将足够聪明,可以在写入时自动用\r\n替换任何'\ n',并用单个{{1}对称地替换文件中的\r\n },前提是该文件以 text 模式打开。但是在Linux上什么也不会发生。

长话短说,Linux和Windows上文本文件的行尾不同,而具有\n的文本文件在Linux上称为 dos文本文件

您可能已经为此感到困惑,唯一可以确定的方法是以二进制模式打开文件并显示字节值(十六进制以使习惯于ASCII码的人更容易理解)

答案 1 :(得分:0)

您没有替换相同的值,而是要删除\之前的\n。当处理字符串时,反斜杠通常意味着您有一个特殊的字符(例如换行符\n,制表符\t等),但有时您希望打印一个实际的反斜杠!为此,我们在Python中使用\\添加一个反斜杠。

因此,在第一个示例中打印时,python到达\n并认为“换行”,在第二个示例中python看到\\n,因此前两个\表示打印反斜杠,然后将n当作普通n对待并打印