Python中的readline()错误

2024-10-03 21:36:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我对readline()方法有一个问题,它有时返回2行而不是1行,我不知道为什么。有人能帮我吗?在

以下是我阅读的文本文件的一部分(使用记事本):

at+gpsinit=2
OK

+GPSEVINIT: 1
at+gpsnmea=3
OK
at+gpsstart=0
OK

使用记事本++:

^{pr2}$

这里是我在Python shell中得到的:

16 : at+gpsinit=2

17 : 

18 : OK

19 : 

20 : +GPSEVINIT: 1

21 : at+gpsnmea=3

我的代码是:

# Open a file
file = open("testtxt.txt", 'r')
line = 0

for current_line in file:
    line += 1    
    print(str(line)+" : "+current_line)

# Close opend file
file.close()

Tags: 方法readlinelineokcurrentshellatfile
3条回答

好的,所以我解决了我的问题,似乎Np给了我错误的文本文件。不管怎样,我用了这个命令:

file = open("testtxt.txt", 'r', newline="\r\n")

它给了我很好的台词。在

readline()例程中肯定没有bug;太多人经常使用它,除非您有一个非常奇怪的实现,它不是标准的Python,否则您也将使用一个不错的版本。在

你所提供的信息还不足以确定你的问题是什么原因,但我建议用一些分析方法来找出你正在处理的问题。在

您应该仔细看看行中有什么,哪些字节终止了您的行('\n'或{}或其他),并特别仔细地观察at+gpsinit=2行及其结尾。在

在Unix系统上,您可以使用od(或xxd)来完成此操作。使用选项-c打印字符。使用-t x1 -t c也可以获得每个字节的十六进制输出。在

您遇到的问题很可能是由于行尾标记的问题。在

  • Windows/Dos通常使用CRLF(或,\r\n,或{}字节)。在
  • Unix通常使用LF(或\n,或{}字节)
  • MacOS通常使用CR(或\r,或{}字节)

以下是ASCII编码文件的一些示例:

$ hexdump -C test_dos.txt
00000000  68 65 6c 6c 6f 0d 0a 77  6f 72 6c 64 0d 0a        |hello..world..|
0000000e

$ hexdump -C test_nix.txt
00000000  68 65 6c 6c 6f 0a 77 6f  72 6c 64 0a              |hello.world.|
0000000c

$ hexdump -C test_mac.txt
00000000  68 65 6c 6c 6f 0d 77 6f  72 6c 64 0d              |hello.world.|
0000000c

你可以看到,单词hello68 65 6c 6c 6f)后面分别跟着不同的字节0d 0a0a或{}。在MS记事本中编辑文件时,很可能会插入CRLF。由于LF在软件开发中最常见,Notepad++很可能会添加这些功能。在

现在,对于您的代码:给定上面的三个文件,与您的代码类似的代码会产生以下结果:

代码:

^{pr2}$

输出:

Reading test_dos.txt
 > 'hello\r\n'
 > 'world\r\n'
                                        
Reading test_nix.txt
 > 'hello\n'
 > 'world\n'
                                        
Reading test_mac.txt
 > 'hello\rworld\r'
                                        

可以清楚地看到,Python对\n字符进行拆分,但不会将其从输出中删除。这就是为什么“mac”示例只有一行。在

如果必须处理来自异类源的文件,请考虑使用U标志将“universal newlines”支持激活为open。在

这里有一个例子。注意,唯一改变的是U参数改为open

files = ('test_dos.txt', 'test_nix.txt', 'test_mac.txt')

for fname in files:
    print("Reading {}".format(fname))
    with open(fname, 'U') as fptr:
        for line in fptr:
            print(" > {!r}".format(line))
    print(80*"-")

输出:

Reading test_dos.txt
 > 'hello\n'
 > 'world\n'
                                        
Reading test_nix.txt
 > 'hello\n'
 > 'world\n'
                                        
Reading test_mac.txt
 > 'hello\n'
 > 'world\n'
                                        

如您所见,并非所有文件的行为都相同。这可能会提示您在阅读文本文件的任何地方插入U。然而,我确信这是一个很好的理由,为什么它不是默认的!:)

相关问题 更多 >