python tips:文件读取——换行符的问题

问题:在windows系统中,换行的符号是‘\r\n‘。python在读文件的时候为了系统兼容,会默认把‘\r‘,‘n‘,‘\r\n‘都视作换行。但是在windows文件中,可能在同一行中同时存在‘\n‘,‘\r\n‘,‘\r‘。这个时候python的默认行为会将一行拆分成多行输出,影响预期结果。

此时需要设置open函数的newline参数,修改python对换行的默认行为。

open(file, mode=‘r‘, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

newline有五种取值:None,‘‘,‘\n‘,‘\r‘,‘\r\n‘。

在输入过程(从文件到程序),newline用于定义换行的符号:

1.如果newline为None,碰到‘\r‘,‘\n‘,‘\r\n‘都算行尾,而且这些符号都会被转换成‘\n‘。

2.如果newline为‘‘,也是碰到‘\r‘,‘\n‘,‘\r\n‘都算行尾,但是这些符号不会发生转换。

3.如果newline为‘\r‘,‘\n‘,‘\r\n‘,等于是显示指定了换行符,而且行中的符号不会发生转换。

在输出过程(从程序到文件),newline用于指定‘\n‘的转换符号:

1.如果newline为None,所有的‘\n‘都被转换成系统换行符。

2.如果newline为‘‘,‘\n‘,不会发生转换。

3.如果newline为‘\r‘,‘\r\n‘,所有的‘\n‘会被转换成‘\r‘或者‘\r\n‘。

实例一:输出不指定newline,所有的‘\n‘都被替换成‘\r\n‘,即使是‘\r\n‘中的‘\n‘也不例外。

def file_seperator_test1():
    # output
    with open("medical.txt", "w") as f:
        f.write("I am a\r good\n boy.\r\n")
    #input
    with open("medical.txt", "r", newline="\r\n") as f:
        print(list(f))

if __name__ == "__main__":
    file_seperator_test1()

输出结果:

[‘I am a\r good\r\n‘, ‘ boy.\r\r\n‘]

实例二: 输出指定newline为‘‘或‘\n‘,不会转换

def file_seperator_test2():
    # output
    with open("medical.txt", "w", newline="") as f:
        f.write("I am a\r good\n boy.\r\n")
    with open("medical2.txt", "w", newline="\n") as f:
        f.write("I am a\r good\n boy.\r\n")

    #input
    with open("medical.txt", "r", newline="\r\n") as f:
        print(list(f))
    with open("medical2.txt", "r", newline="\r\n") as f:
        print(list(f))

if __name__ == "__main__":
    file_seperator_test2()

输出结果:

[‘I am a\r good\n boy.\r\n‘]
[‘I am a\r good\n boy.\r\n‘]

实例三:输出指定newline为‘\r‘或‘\r\n‘,所有的‘\n‘都被替换了,当所有‘\n‘都被替换成‘\r‘时,在windows中,换行符就不见了,所有的行变成了一行

def file_seperator_test3():
    # output
    with open("medical.txt", "w", newline="\r") as f:
        f.write("I am a\r good\n boy.\r\n where should\r\n I change the line ?\r\n")
        f.write("I can‘t stop\r\n")
    with open("medical2.txt", "w", newline="\r\n") as f:
        f.write("I am a\r good\n boy.\r\n")

    #input
    with open("medical.txt", "r", newline="\r\n") as f:
        print(list(f))
    with open("medical2.txt", "r", newline="\r\n") as f:
        print(list(f))

if __name__ == "__main__":
    file_seperator_test3() 

输出结果:

["I am a\r good\r boy.\r\r where should\r\r I change the line ?\r\rI can‘t stop\r\r"]
[‘I am a\r good\r\n‘, ‘ boy.\r\r\n‘]

实例四:输入不指定newline,默认把所有的三种符号都当做换行符,而且全都转换成‘\n‘

def file_seperator_test4():
    # output
    with open("medical.txt", "w", newline="") as f:
        f.write("I am a\r good\n boy.\r\n")
    #input
    with open("medical.txt", "r") as f:
        print(list(f))

if __name__ == "__main__":
    file_seperator_test4() 

输出结果:

[‘I am a\n‘, ‘ good\n‘, ‘ boy.\n‘]

实例五:输入指定newline为‘‘,仍然把三种符号都当做换行符,但是不转换

def file_seperator_test5():
    # output
    with open("medical.txt", "w", newline="") as f:
        f.write("I am a\r good\n boy.\r\n")
    #input
    with open("medical.txt", "r", newline="") as f:
        print(list(f))

if __name__ == "__main__":
    file_seperator_test5()

输出结果:

[‘I am a\r‘, ‘ good\n‘, ‘ boy.\r\n‘]

实例六:输入指定newline为‘\r‘,‘\n‘,‘\r\n‘,显式指定了换行符,只有碰到这几个符号才会换行

def file_seperator_test6():
    # output
    with open("medical.txt", "w", newline="") as f:
        f.write("I am a\r good\n boy.\r\n where should\r\n I change the line ?\r\n")
        f.write("I can‘t stop\r\n")
    with open("medical2.txt", "w", newline="") as f:
        f.write("I am a\r good\n boy.\r\n where should\r\n I change the line ?\r\n")
        f.write("I can‘t stop\r\n")
    with open("medical3.txt", "w", newline="") as f:
        f.write("I am a\r good\n boy.\r\n where should\r\n I change the line ?\r\n")
        f.write("I can‘t stop\r\n")

    #input
    with open("medical.txt", "r", newline="\r") as f:
        print(list(f))
    with open("medical2.txt", "r", newline="\n") as f:
        print(list(f))
    with open("medical3.txt", "r", newline="\r\n") as f:
        print(list(f))

if __name__ == "__main__":
    file_seperator_test6()

输出结果:

[‘I am a\r‘, ‘ good\n boy.\r‘, ‘\n where should\r‘, ‘\n I change the line ?\r‘, "\nI can‘t stop\r", ‘\n‘]
[‘I am a\r good\n‘, ‘ boy.\r\n‘, ‘ where should\r\n‘, ‘ I change the line ?\r\n‘, "I can‘t stop\r\n"]
[‘I am a\r good\n boy.\r\n‘, ‘ where should\r\n‘, ‘ I change the line ?\r\n‘, "I can‘t stop\r\n"]

结论:

1.如果要写入带‘\n‘的行,可以把newline设定为‘‘或者‘\n‘,避免python更改‘\n‘

2.如果要读入带‘\n‘的行,可以把newline设定为‘\r\n‘,指定换行符只能是‘\r\n‘。

原文地址:https://www.cnblogs.com/luoheng23/p/9492732.html

时间: 2024-10-09 07:20:48

python tips:文件读取——换行符的问题的相关文章

【Python】按行读取文件、IOError: [Errno 22] invalid mode ('a+') or filename,处理文件的换行符

Python一次性读取文件的所有内容在<[Python]文件读写操作>(点击打开链接)中已经说明过的,但有些时候,需要对文件中的每一行进行处理. 比如有一个f:\1.txt如下: 此时,如果要按行读取这个文件,可以直接利用Pyhon的for循环来读取,其中for的对象是这个文件指针,代码如下: file_path="f:\\a.txt" fp=open(file_path,"a+"); for eachline in fp: print eachline

Linux文件和windows文件在 换行符的区别

Linux或Unix文件,和windows文件,在来回处理时,如果不注意 换行符的区别,可能导致程序错误!!!深刻的教训.... 在早期的打印机时代,开始新的一行要占用两个字符的时间.如果到了一行的结尾处,你要快速回到新的一行的开头,需要打印针头在纸面上飞快地掠过,常常会在纸面上留下污点.解决这个问题的办法就是,用两个字符:一个字符<Return>来移到第一列,另一个字符<Line feed>来新增一行.计算机产生以后,存储较为昂贵,在如何解决回车换行这个老问题上,人们产生了不同的

python实现readline去掉换行符\n

刚刚用python的readline(s)读取文件的发现进行后续处理的时候总是会出现格式上等的一些小错误,后来想起来是因为文件换行符等一些符号(\n\r\t)也会被readline(s)读取到,以下是我用到的小方法 举个栗子吧,以下是我的文件内容: In [1]: cat /tmp/ip.txt 111.231.0.0/16 122.152.0.0/16 140.143.0.0/16 59.110.0.0/16 106.75.0.0/16 将文件读到变量 f 中,然后执行redline发现其实里

python实现readline去掉换行符\n等特殊字符

刚刚用python的readline(s)读取文件的发现进行后续处理的时候总是会出现格式上等的一些小错误,后来想起来是因为文件换行符等一些符号(\n\r\t)也会被readline(s)读取到,以下是我用到的小方法 举个栗子吧,以下是我的文件内容: In [1]: cat /tmp/ip.txt 111.231.0.0/16 122.152.0.0/16 140.143.0.0/16 59.110.0.0/16 106.75.0.0/16 将文件读到变量 f 中,然后执行redline发现其实里

****使用ftp软件上传下载php文件时换行符丢失bug

在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了,导致php文件无法正常运行. 这个时候,再次通过ftp软件把刚才上传的php文件下载到本地windows,用notepad++编辑器打开后,发现php源代码变成了一行,换行丢失. 发生这种情况的原因是什么呢?飘易就以一句话概括下:    由于linux下换行是\n,而windows下换行是\r\n,当ftp软件在

Java中写入文件时换行符用"\r\n"、"\n"、"\r"?

Java是一个跨平台的语言,因为如果想写一个跨平台的软件,有些东西就需要考虑,例如换行. \r: 叫回车 Carriage Return \n: 叫新行 New Line 他们都会造成换行,那么我们如何确定使用哪个呢?  通常建议使用line.separator的系统属性 System.getProperty("line.separator")来获取当前OS的换行符,可以在调试的情况下看到! 不过如果你是在写一个网络程序或者服务器程序,则需要硬编码为"\r\n",而

windows下建立文件的换行符^M导致linux下的shell脚本运行错误的解决方案

经常在windows下编辑的文件远程传送到linux下的时候每行末尾都会出现^M,这将导致shell脚本运行错误,主要是因为dos下的编辑器和linux下的编辑器对文件末行的回车符处理不一致导致. 主要解决如下: (1)在VI编辑器中将^M删除: 将VI编辑器切换到命令模式下,输入 :%s/^M//g (注意^M 不是shift ^ +M 而是ctrl+v 加上ctrl+m)  s///g是shell的替换命令 此命令必须是手动打上,不可复制. (2)dos2unix 命令 dos2unix f

Python txt文件读取写入字典的方法(json、eval)

一.使用json转换方法 1.字典写入txt import json dic = { 'andy':{ 'age': 23, 'city': 'beijing', 'skill': 'python' }, 'william': { 'age': 25, 'city': 'shanghai', 'skill': 'js' } } js = json.dumps(dic) file = open('test.txt', 'w') file.write(js) file.close() 2.读取txt

用python实现文件读取和内容替换

infile = open("D:/test.txt", "r") #打开文件 outfile = open("D:/pp2.txt", "w") # 内容输出 for line in infile: #按行读文件,可避免文件过大,内存消耗 outfile.write(line.replace(' ', ' '))#first is old ,second is new infile.close() #文件关闭 outfile